view src/strings.asm @ 604:ca4556fb60b9

bump to 2.99beta, work on 3.00 stable
author heinrichsweikamp
date Thu, 22 Nov 2018 19:47:26 +0100
parents b7eb98dbd800
children c40025d8e750
line wrap: on
line source

;=============================================================================
;
;   File strings.asm													V2.99c
;
;   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 "hwos.inc"
#include "varargs.inc"

	extern	aa_wordprocessor

strings		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				; ahall we print afterwards?
	return							; NO  - then return straight away
	goto	aa_wordprocessor        ; YES - print it...

;=============================================================================
; Copy multi-lingual text from FSR1 12 bit pointer to buffer
;
; Input:   FSR1 = 12 bit pointer to multi-lingual text
; Output:  FSR2 pointing to closing null byte in buffer
; Trashed: TBLPTR, TABLAT

	global	strcpy_text
strcpy_text:
	rcall	text_get_tblptr
	bra		strcpy_prom

; Copy and print multi-lingual text from FSR1 12 bit pointer to buffer
;
; Input:   FSR1 = 12 bit pointer to multi-lingual text
; Output:  FSR2 pointing 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 12 bit pointers to buffer at FRS2
;
; Input:  FSR1 = 12 bit pointer to multi-lingual text
;         FSR2 = current position in buffer
; Output: FSR2 pointing to closing null byte in buffer
; Trashed: TBLPTR, TABLAT

	global	strcat_text
strcat_text:
	rcall	text_get_tblptr
	bra		strcat_prom

; Append and print multi-lingual text from FSR1 12 bit pointers to buffer at FRS2
;
; Input:   FSR1 = 12 bit pointer to multi-lingual text
;          FSR2 = current position in buffer
; Output:  FSR2 pointing 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 text in TBLPTR
;
; Input:  FSR1         = 12 bit text handle
;         opt_language = current language
; Output: TBLPTR       = 24 bit PROM address

	global	text_get_tblptr
text_get_tblptr:
	extern	text_1_base
	movlw	UPPER(text_1_base)		; complete 12 bit address to 24 bit address
	movwf	TBLPTRU
	movlw	HIGH(text_1_base)
	andlw	0xF0
	iorwf	FSR1H,W
	movwf	TBLPTRH
	movff	FSR1L,TBLPTRL

 IF _language_2!=none
	movff	opt_language,WREG		; get language selection
	bz		text_get_lang1			; 0: language 1
	dcfsnz	WREG
	bra		text_get_lang2			; 1: language 2
 ENDIF

text_get_lang1:						; read 2-byte pointer to string
	tblrd*+
	movff	TABLAT,WREG
	tblrd*+
	movff	WREG,TBLPTRL
	movff	TABLAT,TBLPTRH
	return

 IF _language_2!=none
text_get_lang2:						; add offset for second language
	extern	text_2_base
	movlw	LOW(text_2_base)
	addwf	TBLPTRL
	movlw	HIGH(text_2_base)
	addwfc	TBLPTRH
	movlw	UPPER(text_2_base)
	addwfc	TBLPTRU

	movlw	LOW(text_1_base)
	subwf	TBLPTRL
	movlw	HIGH(text_1_base)
	subwfb	TBLPTRH
	movlw	UPPER(text_1_base)
	subwfb	TBLPTRU
	bra		text_get_lang1
 ENDIF

;=============================================================================
; Copy a null-terminated string from TBLPTR to buffer
;
; Input:  TBLPTR : string pointer into PROM
; Output: string in buffer, FSR2 pointing to the closing null byte
;
	global	strcpy_prom
strcpy_prom:
	lfsr	FSR2,buffer
	;bra	strcat_prom

; Append a null-terminated string from TBLPTR to buffer
;
; Input:  TBLPTR : string pointer into PROM
;         FRS2   : current character position
; Output: string in buffer, FSR2 pointing to the closing null byte
;
	global	strcat_prom
strcat_prom:
	tblrd*+
	movf	TABLAT,W
	movwf	POSTINC2
	bnz		strcat_prom
	movf	POSTDEC2,W				; step back one char
	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			; needs a bank-safe move here !
	bra		start_common

	global	start_small_block
start_small_block:
	movlw	1
	movff	WREG, win_font			; needs a bank-safe move here !
	bra		start_common

	global	start_std_block
start_std_block:
	movlw	2
	movff	WREG, win_font			; needs a bank-safe move here !
	bra		start_common

	global	start_medium_block
start_medium_block:
	movlw	3
	movff	WREG, win_font			; needs a bank-safe move here !
	bra		start_common

	global	start_large_block
start_large_block:
	movlw	4
	movff	WREG, win_font			; needs a bank-safe move here !
	;bra	start_common

start_common:
	VARARGS_BEGIN
		VARARGS_GET8	win_leftx2
		VARARGS_GET8	win_top
	VARARGS_END
	lfsr	FSR2,buffer				; point to buffer
	return

	END