誰でもわかるVZエディタ。char.asm

祝VZエディタソースコード公開
https://qiita.com/kaizen_nagoya/items/baad23cf4a041ce845a9

祝：ソースコード公開：VZエディタ移植の方法と成果。註釈 coding(123)
https://qiita.com/kaizen_nagoya/items/5551be98dcbed8f41949

オープンソース化されたVZエディタをブラウザ上で動かしてみる
https://qiita.com/Takaraya/items/785ac9319c3934e30703

# Github
vcraftjp/VZEditor
https://github.com/vcraftjp/VZEditor/

誰でもわかるVZエディタ。0から始める。
https://qiita.com/kaizen_nagoya/items/afe6c4cdccbfdd94baab
## SRC
順次、ソースコードの解説、改良点などを追記予定。

source code
https://github.com/vcraftjp/VZEditor/tree/main/SRC


ALIAS.ASM
BLOCK.INC
CHAR.ASM
CHKTSR.ASM
CORE.ASM
CTYPE.INC
DISP.ASM
DOS.ASM
EMS.ASM
EXPR.ASM
EZKEY.ASM
FILER.ASM
FROLL.ASM
GETS.ASM
HARDERR.ASM
INST.ASM
KEY.ASM
KEY98.ASM
KEYIBM.ASM
LEDIT.ASM
MACRO.ASM
MAIN.ASM
MEMO.ASM
MENU.ASM
MISC.ASM
MSG.ASM
OPEN.ASM
PRINTF.ASM
SCRN.ASM
SCRN98.ASM
SCRNIBM.ASM
SMOOTH.ASM
SPRINTF.INC
STD.INC
STRING.ASM
SWAP.ASM
TEXT.ASM
VIEW.ASM
VMAP.ASM
VZ.INC
VZSEL.ASM
WIND.ASM
XSCR.ASM
ZCOPY.ASM


## char.asm
char.asmでは vz.inc をincludeしている。
vz.inc は std.inc をincludeしている。

VZ SRC INC
https://qiita.com/kaizen_nagoya/items/fc7c856991869f72cb90
```c:char,asn
;****************************
;	'char.asm'
;****************************

	include	vz.inc

	bseg

;--- Is upper? ---
;<-- CY :'A'-'Z'

	public	isupper
isupper	proc
	cmp	al,'A'
	jb	notup
	cmp	al,'Z'
	ja	notup
	stc
isupr9:	ret
notup:	clc
	ret
isupper	endp

;--- Is lower/alpha? ---
;<-- CY :'a'-'z'|'A'-'Z'

	public	isalpha,islower
isalpha	proc
	call	isupper
	jc	isal9
islower:
	cmp	al,'a'
	jb	notalp
	cmp	al,'z'
	ja	notalp
	stc
	ret
notalp:	clc
isal9:	ret
isalpha	endp

	endbs

	eseg

;--- Is digit ? ---
;<-- CY :'0'-'9'

	public	isdigit
isdigit proc
	cmp	al,'0'
	jb	notdig
	cmp	al,'9'
	ja	notdig
	stc
	ret
notdig:	clc
	ret
isdigit endp

;--- Is kanji ? ---
;<-- CY :kanji

	public	iskanji
iskanji	proc
	ifkanji kjyes
	clc
	ret
kjyes:	stc
	ret
iskanji	endp

;--- Char to upper/lower case ---
;--> AL :char
;<-- CY :converted

	public	toupper,tolower
toupper	proc
	call	islower
_if c
	sub	al,'a'-'A'
	stc
_endif
	ret
toupper	endp

tolower	proc
	call	isupper
_if c
	add	al,'a'-'A'
	stc
_endif
	ret
tolower	endp

;--- String to upper/lower case ---
; DS:SI :string ptr

	public	strupr,strlwr
strupr	proc
_repeat
	lodsb
	tst	al
  _break z
	call	iskanji
	jc	strup2
	call	toupper
  _cont nc
	mov	[si-1],al
  _cont
strup2:	lodsb
_until
	ret
strupr	endp

strlwr	proc
_repeat
	lodsb
	tst	al
  _break z
	call	iskanji
	jc	strlw2
	call	tolower
  _cont nc
	mov	[si-1],al
  _cont
strlw2:	lodsb
_until
	ret
strlwr	endp

;--- Copy string ---
;-->
; DS:SI :source ptr
; ES:DI :destin ptr

	public	strcpy
strcpy	proc
_repeat
	lodsb
	stosb
	tst	al
_until z
	dec	di
	ret
strcpy	endp

;--- Copy string (max) ---
;-->
; DS:SI :source ptr
; ES:DI :destin ptr
; CX :maximum byte

	public	strncpy
strncpy proc
	jcxz	sncpy2
_repeat
	lodsb
	stosb
	tst	al
	jz	sncpy3
_loop
sncpy2:	clr	al
	stosb
sncpy3:	dec	di
	ret
strncpy endp

;--- Copy word ---
;-->
; DS:SI :source ptr
; ES:DI :destin ptr

	public	wrdcpy
wrdcpy	proc
_repeat
	lodsb
	stosb
	cmp	al,SPC
_until be
	dec	si
	dec	di
	mov	byte ptr es:[di],0
	ret
wrdcpy	endp

;--- Compare two strings ---
;--> SI,DI :string ptr
;<-- ZR :equal

	public	strcmp,strcmp1
strcmp	proc
	pushm	<si,di>
	call	strcmp1
	popm	<di,si>
	ret
strcmp	endp

strcmp1	proc
	push	cx
	push	di
	clr	al
	mov	cx,-1
  repnz scasb
	not	cx
	pop	di
    rep cmpsb
	mov	al,es:[di-1]
	pop	cx
	ret
strcmp1	endp

;----- Ignore case compare -----
;--> SI,DI :string ptr
;<-- ZR :equal

	public	stricmp
stricmp	 proc
	pushm	<si,di>
_repeat
	lodsb
	call	toupper
	mov	ah,al
	mov	al,es:[di]
	inc	di
	call	toupper
	cmp	al,ah
  _break ne
	tst	al
_until z
	popm	<di,si>
	ret
stricmp	endp

;--- Ignore case word compare ---
;--> SI,DI :string ptr
;<-- CY :equal

	public	wrdicmp
wrdicmp	proc
	push	si
_repeat
	lodsb
	call	toupper
	mov	ah,al
	mov	al,es:[di]
	inc	di
	call	toupper
	cmp	al,SPC
	jbe	wcmp1
	cmp	al,ah
_while e
wcmp_x:	clc
	dec	di
	jmps	wcmp9
wcmp1:	cmp	ah,SPC
	ja	wcmp_x
	stc
wcmp9:	mov	ax,si			; AX=next si
	pop	si
	ret
wrdicmp	endp

;--- String length ---
;--> DS:SI :string ptr
;<-- AX :length

	public	strlen
strlen	proc
	pushm	<cx,di,es>
	movseg	es,ds
	mov	di,si
	call	skipstr
	not	ax
	dec	ax
	popm	<es,di,cx>
	ret
strlen	endp

	public	skipstr
skipstr	proc
	push	cx
	clr	al
	mov	cx,-1
  repnz	scasb
	mov	ax,cx
	pop	cx
	ret
skipstr	endp

	public	strskip
strskip	proc
	pushm	<di,es>
	mov	di,si
	movseg	es,ds
	call	skipstr
	mov	si,di
	popm	<es,di>
	ret
strskip	endp

;--- Skip SPC,TAB ---
;<--
; CY :end of line
; NC :next char

	public	skipspc,skipspc1
skipspc	proc
	lodsb
skipspc1:
	cmp	al,TAB
	je	skipspc
	cmp	al,SPC
	je	skipspc
skpspc8:dec	si
	ret
skipspc	endp

;--- Skip to next char ---
;<--
; CY :end of line
; NC :next char

	public	skipchar
skipchar proc
_repeat
	lodsb
	cmp	al,SPC
_until be
	call	skipspc1
	ret
skipchar endp

;--- Change LF to NULL ---
;--> DI :string ptr
;<-- AX :string length

	public	lftonull
lftonull proc
	push	cx
	mov	cx,-1
	mov	al,LF
  repne	scasb
	dec	di
	mov	ax,cx
	not	ax
	dec	ax
	mov	byte ptr [di],0
	pop	cx
	ret
lftonull endp

;--- Scan CS:table ---

	public	scantbl
scantbl	proc
	push	es
	movseg	es,cs
  repne	scasb
	pop	es
	ret
scantbl	endp
	ret

;----- strchr(s,c) -----
;<-- CY :found(SI:ptr, CX:index)

		public	strchr,strichr
strchr		proc
		push	bx
		mov	bh,FALSE
		jmps	strchr1
strichr:	push	bx
		mov	bh,TRUE
		xchg	ax,dx
		tst	ah
	_if z
		call	toupper
	_endif
		xchg	ax,dx
strchr1:
		clr	cx
_repeat
		inc	cx
		lodsb
		tst	bh
	_ifn z
		call	toupper
	_endif
		clr	ah
		tst	al
		jz	strchr_x
	_if s
		call	iskanji
	  _if c
		mov	ah,al
		lodsb
	  _endif
	_endif
		cmp	ax,dx
_until e
		dec	cx
		dec	si
		tst	ah
	_ifn z
		dec	si
	_endif
		stc
strchr_x:	pop	bx
		ret
strchr		endp

;----- strstr(si,di) -----
;<-- CY :found

		public	strstr,stristr
strstr		proc
		push	bx
		mov	bh,FALSE
		jmps	strstr1
stristr:	push	bx
		mov	bh,TRUE
strstr1:	tst	cx
	_if z
		dec	cx
	_endif
		tstb	[si]
		jz	strstr9
		tst	di
		jz	strstr9
_repeat
		tst	bh
	_if z
		call	strcmp
	_else
		call	stricmp
	_endif
		tst	al
		stc
		je	strstr9
		lodsb
		call	iskanji
	_if c
		inc	si
	_endif
		tstb	[si]
		jz	strstr8
_loop
strstr8:	clc
strstr9:	pop	bx
		ret
strstr		endp

	endes
	end

;****************************
;	'char.asm'
; Copyright (C) 1989 by c.mos
;****************************
```