#asm
; Assorted routines derived from libraries supplied with
;         Mike Bernson's Small C.
; TRUE, FALSE defined in CRUN.LIB
;
;	toupper
;
;	FUNCTION: TO SHIFT LOWER CASE CHARACTER TO UPPER
;
;	Format:	toupper(CHAR)
;
toupper:
	LD A,L
	CP 61H
	RET C
	CP 7BH
	RET NC
	AND 5FH
	LD L,A
	RET

;
;	tolower
;
;	FUNCTION: TO CONVERT CHARACTER TO LOWER CASE
;
;	Format:	tolower(CHAR)
;
tolower:
	LD A,L
	CP 'A' 
	RET C 
	CP 'Z'+1
	RET NC
	ADD A,20H
	LD L,A
	RET
;
;	isalpha
;
;	FUNCTION CHECK TO SEE IF ALPHA CHARACTER a-z OR A-Z ONLY
;
;	Format:	isalpha(CHAR)
;
isalpha:
	PUSH HL
	CALL isupper
	EX DE,HL
	POP HL
	CALL islower
	ADD HL,DE
	RET
;
;	isupper
;
;	FUNCTION: TO CHECK TO SEE IF CHARACTER IS UPPER CASE
;
;	Format:	isupper(CHAR) 
;
isupper:
	LD A,L
	CP 'A'
	JP C,ccISUP1
	CP 'Z'+1 
	JP NC,ccISUP1
	LD HL,TRUE  ;Upper  case
	RET
ccISUP1:
	LD HL,FALSE  
	RET
;
;	islower
;
;	FUNCTION: TO CHECK TO SEE IF CHARACTER IS LOWER CASE
;
;	Format:	islower(CHAR)
;
islower:
	LD A,L
	CP 'a'
	JP C,ccISLW1
	CP 'z'+1
	JP NC,ccISLW1
	LD HL,TRUE  ;Lower case
	RET
ccISLW1:
	LD HL,FALSE  ; FALSE
;
;
;	isdigit
;
;	FUNCTION: TO CHECK TO SEE IF CHARACTER IS DIGIT 0-9 ONLY
;
;	Format:	isdigit(CHAR)
;
isdigit:
	LD A,L
	CP '0' 
	JP C,ccISDG1
	CP '9'+1
	JP NC,ccISDG1
	LD HL,TRUE
	RET
ccISDG1:
	LD HL,FALSE
	RET
;
;	isspace
;
;	FUNCTION: TO CHECK TO SEE IF WHITE SPACE TAB OR BLANK
;
;	Format:	isspace(CHAR)
;
isspace:
	LD A,L
	LD HL,TRUE
	CP ' '
	RET Z
	CP 9
	RET Z
	LD HL,FALSE
	RET
;
;	strlen
;
;	FUNCTION: TO GET THE LENGTH OF A STRING
;
;	Format:	LEN=strlen(STRING) 
;
;
strlen:	
	EX DE,HL
	LD HL,0
ccSTLN1:
	LD A,(DE)
	OR A
	RET Z
	INC HL
	INC DE
	JP ccSTLN1
;
;	strcpy
;
;	FUNCTION: TO COPY FIRST SECOND STRING TO FIRST STRING
;
;	Format:	strcpy(OBJECT,SOURCE) 
;
;
strcpy:	
	POP BC 
	POP DE
	POP HL
	PUSH HL
	PUSH DE
	PUSH BC
	PUSH HL
ccSCPY1:
	LD A,(DE)
	LD (HL),A
	OR A
	JP Z,ccSCPY2
	INC HL
	INC DE
	JP ccSCPY1
ccSCPY2:
	POP HL
	RET
;
;	strcat
;
;	FUNCTION: TO PUT STRING2 AT THEN END OF STRING1 AND RETURN ADDRESS OF 
;	      	  STRING 1
;
;	Format:	strcat(STRING1,STRING2) 
;
;
strcat:	
	POP BC
	POP DE
	POP HL
	PUSH HL
	PUSH DE
	PUSH BC
	PUSH HL
ccSCAT1:
	LD A,(HL)
	OR A
	JP Z,ccSCAT2
	INC HL
	JP ccSCAT1 
ccSCAT2:
	LD A,(DE)
	LD (HL),A
	OR A  
	JP Z,ccSCAT3
	INC HL
	INC DE
	JP ccSCAT2
ccSCAT3:
	POP HL
	RET
;
;	strpos
;
;	FUNCTION: TO LOOK FOR STRING 2 IN STRING 1
;
;	Format:	strpos(STRING1,STRING2) 
;
;
strpos:	
	POP BC
	POP DE
	POP HL
	PUSH HL
	PUSH DE
	PUSH BC
	LD BC,1
	EX DE,HL
ccSTPS1:
	LD A,(DE)
	OR A 
	JP Z,ccSTPS5
	CP (HL)
	JP Z,ccSTPS2
	INC DE
	INC BC
	JP ccSTPS1
ccSTPS2:
	PUSH HL
	PUSH DE
ccSTPS3:
	INC DE
	INC HL
	LD A,(HL)
	OR A
	JP Z,ccSTPS4
	LD A,(DE)
	CP (HL)
	JP Z,ccSTPS3 
	POP DE
	POP HL
	INC DE
	INC BC
	JP ccSTPS1
ccSTPS4:
	LD L,C ;Found
	LD H,B
	POP BC
	POP BC
	RET
ccSTPS5:
	LD HL,0 ;Not found
	RET
;
;
#endasm
PY2:
	POP HL
	RET
;
;	strcat
;
;	FUNCTION: TO PUT STRING2 AT THEN END OF STRING1 AND RETURN ADDRE