diff options
Diffstat (limited to 'programs/sub-suite/utils.s')
| -rw-r--r-- | programs/sub-suite/utils.s | 257 | 
1 files changed, 40 insertions, 217 deletions
diff --git a/programs/sub-suite/utils.s b/programs/sub-suite/utils.s index a66f036..046164a 100644 --- a/programs/sub-suite/utils.s +++ b/programs/sub-suite/utils.s @@ -1,22 +1,5 @@  ; Utility subroutines for SuBAsm. -.org util_data -; Hex character table. -hex_char: -	.byte "0123456789ABCDEF" - -; Compare, and return table for pre-tokens. -ptok_tab: -	.byte ".@:=+-><(),xy\"\'#;$%" -; Compare, and return table for isdelm. -dtab: -	.byte "\n,\"\' " -; Compare, and return table for isdelm2. -dtab2: -	.byte "),.+<>-=;\n" - -.org utils -  print_hi:  	and #0		; Reset A.  	sta idx3	; Clear the string index. @@ -139,48 +122,6 @@ print_hex:  	rts		; End of print_hex. -strtoull: -	phy.w		; Preserve Y. -	sta f		; Save the base. -	and #0		; Reset A. -	tay		; Reset Y. -	sta.q valbuf	; Reset the value buffer. -@loop: -	lda (ptr3), y	; Get a character from the string. -	pha		; Preserve the character. -	jsr isdigit	; Is this character, a digit? -	pla		; Get the character back. -	bne @digit	; Yes, so extract the value from it. -	jsr tolower	; No, so convert the character to lowercase. -	pha		; Preserve the character. -	jsr islower	; Is this an alphabetical character? -	pla		; Get the character back. -	beq @end	; No, so we're done. -@alpha: -	sec		; Yes, so prepare for a non borrowing subtract. -	sbc #'a'-10	; Get the numeric value from this digit. -	bra @chkbase	; Check if the value matches the base. -@digit: -	sec		; Prepare for a non borrowing subtract. -	sbc #'0'	; Get the numeric value from this digit. -@chkbase: -	cmp f		; Does the value match the base? -	bcs @end	; No, so we're done. -@addval: -	tab		; Save the digit value. -	lda.q valbuf	; Get the value from the value buffer. -	mul f		; Multiply the value by the base. -	clc		; Prepare for a non carrying add. -	aab		; Add the digit value to the total value. -	sta.q valbuf	; Place the value in the value buffer. -	iny		; Increment the string index. -	bra @loop	; Keep looping. -@end: -	ply.w		; Get Y back. -	ldb #0		; Reset B. -	rts		; End of strtoull. - -  charcpy:  	ldx idx3	; Get the string index.  	sta strbuf, x	; Save it in the string buffer. @@ -188,164 +129,46 @@ charcpy:  	rts		; End of charcpy. -strlen: -	ldb #1		; Set the second pointer -	jsr set_ptr	; to the passed pointer. -	deb		; Reset B. -	tba		; Reset A. -	tax		; Reset X. -	phy.w		; Preserve Y. -	txy		; Reset Y. -@loop: -	lda (ptr2), y	; Are we at the end of the string? -	beq @end	; Yes, so we're done. -	iny		; No, so increment the index. -	bra @loop	; Keep looping. -@end: -	tyx		; Return the length in X. -	ply.w		; Get the preserved value back. -	rts		; End of strlen. - - -strcmp: -	ldb #1		; Set the second pointer -	jsr set_ptr	; to the passed pointer. -	deb		; Reset B. -	tba		; Reset A. -	phy.w		; Preserve Y. -	tay		; Reset Y. -@loop: -	ldb #0		; Set the islong flag to false. -	lda (ptr), y	; Are we at the end of the first string? -	beq cmpr	; Yes, so check if we're too short, or too long. -	ldb #1		; No, so set the islong flag to true. -	cmp (ptr2), y	; Is the character of both strings, the same? -	bne cmpr	; No, so check if we're too short, or too long. -	iny		; Yes, so increment the index. -	bra @loop	; Keep looping. - -strcasecmp: -	ldb #1		; Set the second pointer -	jsr set_ptr	; to the passed pointer. -	deb		; Reset B. -	tba		; Reset A. -	phy.w		; Preserve Y. -	tay		; Reset Y. -@loop: -	ldb #0		; Set the islong flag to false. -	lda (ptr), y	; Are we at the end of the first string? -	beq cmpr	; Yes, so check if we're too short, or too long. -	ldb #1		; No, so set the islong flag to true. -	jsr tolower	; Convert the character of string 1 to lowercase. -	phb		; Preserve the islong flag. -	pha		; Preserve the converted character. -	lda (ptr2), y	; Get the character of the second string. -	jsr tolower	; Convert the character of string 2 to lowercase. -	tab		; Place it in B. -	pla		; Get the character of string 1 back. -	cab		; Is the character of both strings, the same? -	plb		; Get the islong flag back. -	bne cmpr	; No, so check if we're too short, or too long. -	iny		; Yes, so increment the index. -	bra @loop	; Keep looping. - -cmpr: -	lda (ptr2), y	; Are we at the end of the second string? -	beq @islong	; Yes, so check the islong flag. -@isshort: -	lda (ptr), y	; No, but are we at the end of the first string? -	beq @short	; Yes, so return -1. -@islong: -	cpb #1		; Is the islong flag true? -	bne @equ	; No, so return 0. -@long: -	lda #1		; Yes, so return 1. -	bra @end	; We are done. -@equ: -	lda #0		; Return 0. -	bra @end	; We are done. -@short: -	lda #$FF	; Return -1. -@end: -	ply.w		; Get the preserved value back. -	rts		; End of strcmp. - - -isdigit: -	sec		; Prepare for a non carrying subtraction. -	sbc #'0'	; Subtract $30 from the passed character. -	and #$FF	; Make sure that we have only one byte. -	cmp #10		; Is the subtracted value, less than 10? -	bcs @false	; No, so return false. -@true: -	lda #1		; Yes, so return true. -	bra @end	; We are done. -@false: -	lda #0		; Return false. -@end: -	rts		; End of isdigit. - -isxdigit: -	pha		; Preserve the character. -	jsr isdigit	; Is this character, a decimal digit? -	pla		; Get the character back. -	bne @true	; Yes, so return true. -@alpha: -	sec		; No, so prepare for a non carrying subtract. -	ora #$20	; Convert it to lowercase. -	sbc #'a'	; Subtract $61 from the character. -	and #$FF	; Make sure that we have only one byte. -	cmp #6		; Is the subtracted value, less than 6? -	bcs @false	; No, so return false. -@true: -	lda #1		; Yes, so return true. -	bra @end	; We are done. -@false: -	lda #0		; Return false. -@end: -	rts		; End of isxdigit. - - -isupper: -	sec		; Prepare for a non carrying subtraction. -	sbc #'A'	; Subtract $41 from the passed character. -	bra isletter	; Check if it's less than 26. -islower: -	sec		; Prepare for a non carrying subtraction. -	sbc #'a'	; Subtract $61 from the passed character. -isletter: -	and #$FF	; Make sure that we have only one byte. -	cmp #26		; Is the subtracted value, less than 26? -	bcs @false	; No, so return false. -@true: -	lda #1		; Yes, so return true. -	bra @end	; We are done. -@false: -	lda #0		; Return false. -@end: -	rts		; End of isletter. - - -tolower: -	pha		; Preserve the character. -	jsr isupper	; Is this character, an uppercase character? -	pla		; Get the character back. -	beq @end	; No, so we're done. -@lower: -	ora #$20	; Yes, so convert it to lowercase. -@end: -	rts		; End of tolower. - - -toupper: -	pha		; Preserve the character. -	jsr islower	; Is this character, a lowercase character? -	pla		; Get the character back. -	beq @end	; No, so we're done. -@upper: -	and #$5F	; Yes, so convert it to uppercase. -@end: -	rts		; End of toupper. +strcmpg: +	ldb.w #strcmp	; Get the address of strcmp. +	phb.q		; Use it for an indirect call. +	ldb.q ptr	; Get the first pointer. +	bra gargs	; Jump to the argument handler. +strcaseg: +	ldb.w #strccmp	; Get the address of strcasecmp. +	phb.q		; Use it for an indirect call. +	ldb.q ptr	; Get the first pointer. +	bra gargs	; Jump to the argument handler. +gargs: +	phb.q		; Use the pointer in B as the first arg. +	pha.q		; Use the value in A as the second arg. +	and #0		; reset a. +	tab		; reset b. +	jsr (sp+17)	; call the pushed routine. +	tab		; Preserve the return value. +	pla.q		; Get the second arg back. +	pla.q		; Get the first arg back. +	pla.q		; Get the pushed routine back. +	tba		; Get the return value back. +	rts		; End of gargs. + + +strtoullg: +	ldb.q ptr3	; Get the third pointer. +	phb.q		; Push the first arg. +	pha		; Push the second arg. +	and #0		; Reset A. +	tab		; Reset B. +	jsr strtoull	; Call strtoull. +	tab		; Preserve the return value. +	pla		; Get the second arg back. +	pla.q		; Get the first arg back. +	tba		; Get the return value back. +	pha.q		; Preserve the return value. +	and #0		; Reset A. +	tab		; Reset B. +	pla.q		; Get the return value back. +	rts		; End of strtoullg.  isdelm2:  | 
