#ifmain ;----------------------------------------------------------------------- #ListOff #Uses mcu.inc #ListOn #MapOff #endif ;------------------------------------------------------------------------ ?_OBJECT_? ;******************************************************************************* ; Purpose: Get the length of an ASCIZ string but only up to the specified char ; Input : HX -> ASCIZ string ; : A = character on which to stop counting ; Output : Carry Clear on success, Carry Set on Error (target not found) ; : A = length of matched string ; Note(s): If an ASCIZ terminator is found before the target character, ; : or if the target is not found at all, then the returned length is ; : to the terminator. StringLengthToChar macro [#]String [#]TargetChar mset #' ' mreq 1,2:[#]String [#]TargetChar #push #spauto :sp pshhx lda ~2~ ldhx ~1~ call ~0~ pulhx #pull endm ;------------------------------------------------------------------------------- #spauto :ab StringLengthToChar proc pshhx .str@@ Loop@@ tst ,x ;is it end of ASCIZ string? clc ;indicate 'success' cbeq x+,Go@@ ;char found, done bne Loop@@ ;repeat until end of ASCIZ string sec ;indicate 'error' Go@@ tpa ;keep CCR for later psha ;put CCR on stack txa ;current pointer LSB tsx sub .str@@+1,spx ;subtract original pointer LSB deca ;always gone one too far, so subtract one tax ;keep length in X for now pula ;get CCR from stack tap ;restore SkipChar CCR condition txa ;put length back in A tsta ;adjust CCR[Z] according to length pulhx rtc #sp ;******************************************************************************* #Exit ;******************************************************************************* @EndStats Msg1 fcs 'Space here' Msg2 fcs 'Space ' Msg3 fcb 0 ok macro value cbeqa #~#1~,Go$$$ bra * Go$$$ endm #MapOn Start proc ldhx #Msg1 clra call StringLengthToChar @ok 10 ldhx #Msg1 lda #' ' call StringLengthToChar @ok 5 ldhx #Msg2 lda #' ' call StringLengthToChar @ok 5 ldhx #Msg2 lda #'?' call StringLengthToChar @ok 6 ldhx #Msg3 lda #'?' call StringLengthToChar @ok 0 ldhx #Msg3 clra call StringLengthToChar @ok 0 bra * @vector Vreset,Start