	page	95,132
;§∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞§
;§                                                                          §
;§            マルチカラム　コンパクト　プリント　ユーティリティ            §
;§                                                                          §
;§   Multicolumn Compact PRint utility   ＭＣＰＲ．ＥＸＥ  Ｖｅｒ１.４０    §
;§   ~           ~       ~~                                                 §
;§              Copyright (C) by 福地 邦雄 1989-1990. All rights reserved.  §
;§∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞§
	public	formprint
	public	inline
	public	curclm
	public	curlin
	public	curblk
	public	curpage
	public	linumber
	public	printend
	public	hdrpgnum
	public	hdrlinoff
	public	hdrlinseg
	public	hdrln2seg
	public	linptr
	extrn	initvaliable:near
	extrn	initpgbuff:near
	extrn	reducepagebuff:near
	extrn	getchar:near
	extrn	ungetchar:near
	extrn	fillineproc:near
	extrn	filgapproc:near
	extrn	hdrpgupdate:near
	extrn	codeprint:near
	extrn	bitprint:near
	extrn	setlinumber:near
	extrn	feedprint:near
;
YES	equ	1
NO	equ	0
TAB	equ	9
CR	equ	0dh
LF	equ	0ah
FF	equ	0ch
DEL	equ	7fh
;
data	segment para	public	'DATA'
;
extrn	startpage:word
extrn	lastpage:word
extrn	clmcnt:word
extrn	lincnt:word
extrn	blkcnt:word
extrn	formfeed:word
extrn	hdrprint:word
extrn	linumb:word
extrn	numclm:word
extrn	clmpitch:word
extrn	tabcount:word
extrn	pageproc:word
;
linumber    dw	    ?
curclm	    dw	    ?
curlin	    dw	    ?
curblk	    dw	    ?
curpage	    dw	    ?
inline	    dw	    ?
srcoff	    dw	    ?
printend    dw	    ?
feedwork    dw	    ?
;
lchclm	    dw	    ?
;
hdrpgnum    dw	    ?
hdrlinoff   dw	    0
hdrlinseg   dw	    0
	    dw	    0
hdrln2seg   dw	    0
linptr	    dd	    256 dup(?)
;
linbuf	    db	    410h dup(?)
;
data	ends
;
code	segment para	public	'CODE'
	assume	cs:code,ds:data
;
formprint   proc
;
	cld
	call	initvaliable
	call	initpgbuff
makepageloop:
	inc	linumber
	call	fgets
	jz	lineproc
	jmp	endoffile
lineproc:
	mov	si,offset linbuf
	call	[pageproc]
	jnz	makepageloop
;
	mov	si,offset linbuf
	mov	srcoff,si
	cmp	byte ptr [si],FF
	jne	nofeed
	inc	srcoff
	mov	al,' '
	mov	bx,curlin
	test	bx,bx
	jz	nofeed
	mov	dx,lincnt
	sub	dx,bx
	ja	setspc
	jmp	nextcolums
setspc:
	shl	bx,1
	shl	bx,1
	add	bx,offset linptr
	mov	si,clmcnt
	cmp	linumb,YES
	jne	feedloop
	add	si,numclm
	inc	si
feedloop:
	mov	cx,si
	les	di,[bx]
    rep stosb
	mov	[bx],di
	lea	bx,[bx+4]
	dec	dx
	jnz	feedloop
	jmp	nextcolums
nofeed:
	mov	curclm,0
	call	setlinumber
	mov	si,srcoff
copyline:
	lodsb
	test	al,al
	jz	eol
	mov	cx,curclm
	cmp	cx,clmcnt
	jae	foldline
	cmp	al,81h
	jb	cpyank
	cmp	al,0a0h
	jb	cpyknj
	cmp	al,0e0h
	jb	cpyank
cpyknj:
	inc	cx
	cmp	cx,clmcnt
	jae	foldline
	mov	ah,al
	lodsb
	xchg	ah,al
	stosw
	add	curclm,2
	jmp	short copyline
cpyank:
	stosb
	inc	curclm
	jmp	short copyline
eol:
	mov	inline,NO
foldline:
	dec	si
	mov	srcoff,si
	call	fillineproc
	inc	curlin
	mov	ax,curlin
	cmp	ax,lincnt
	jae	nextcolums
	jmp	lbfchk
nextcolums:
	mov	curlin,0
	inc	curblk
	mov	ax,curblk
	cmp	ax,blkcnt
	jae	pageend
;
	call	filgapproc
	jmp	lbfchk
endoffile:
	mov	printend,YES
pageend:
	mov	curblk,0
	mov	ax,curpage
	cmp	ax,startpage
	jb	pageskip
	call	reducepagebuff
	jz	noprint
	mov	feedwork,ax
	cmp	clmpitch,3
	je	bitimgprt
	call	codeprint
	jmp	short prtend
bitimgprt:
	call	bitprint
prtend:
	mov	ax,feedwork
	call	feedprint
pageskip:
	call	initpgbuff
noprint:
	cmp	printend,NO
	jne	filend
	inc	curpage
	call	hdrpgupdate
	mov	ax,curpage
	cmp	ax,lastpage
	ja	filend
lbfchk:
	mov	si,srcoff
	cmp	byte ptr [si],0
	jne	existlbf
	jmp	makepageloop
existlbf:
	jmp	nofeed
filend:
	ret
;
formprint   endp
;
fgets	proc
;
	mov	lchclm,0
	mov	di,ds
	mov	es,di
	mov	di,offset linbuf
;
makelineloop:
	cmp	di,(offset linbuf)+400h
	jb	nextchar
	jmp	endofline
nextchar:
	call	getchar
	jnz	endofline
;
	cmp	al,' '
	jb	codectrl
	cmp	al,DEL
	jb	codeank
	cmp	al,81h
	jb	codeskip
	cmp	al,0a0h
	jb	codekanji
	cmp	al,0e0h
	jb	codeank
	cmp	al,0fch
	jbe	codekanji
codeskip:
	jmp	short makelineloop
codeank:
	stosb
	inc	lchclm
	jmp	short makelineloop
codectrl:
	cmp	al,TAB
	jne	chckff
	call	tabproc
	jmp	short makelineloop
chckff:	cmp	al,FF
	jne	chcklf
	cmp	lchclm,0
	jne	existchr
	cmp	curlin,0
	je	makelineloop
	cmp	formfeed,YES
	jne	endofline
	cmp	di,offset linbuf
	jne	makelineloop
	stosb
	jmp	short makelineloop
existchr:
	cmp	formfeed,YES
	je	eolunget
	jmp	short endofline
chcklf:	cmp	al,LF
	je	endofline
	cmp	al,CR
	jne	makelineloop
reinput:
	call	getchar
	jnz	endofline
	cmp	al,0ah
	je	endofline
	cmp	al,0dh
	je	reinput
eolunget:
	call	ungetchar
endofline:
	xor	al,al
	stosb
	cmp	lchclm,0
	je	eofchk
	xor	ax,ax
eofchk:
	test	ax,ax
	ret
;
codekanji:
	mov	dl,al
	call	getchar
	cmp	al,40h
	jb	undefcode
	cmp	al,7fh
	je	undefcode
	cmp	al,0fch
	ja	undefcode
	mov	ah,al
	mov	al,dl
	jmp	short setwcode
undefcode:
	mov	ax,'  '
setwcode:
	stosw
	add	lchclm,2
	jmp	makelineloop
;
fgets	endp
;
tabproc	proc
;
	mov	al,' '
	mov	cx,lchclm
	add	cx,tabcount
	xchg	ax,cx
	push	dx
	cwd
	div	tabcount
	mul	tabcount
	pop	dx
	xchg	ax,cx
	sub	cx,lchclm
	add	lchclm,cx
    rep stosb
	ret
;
tabproc	endp
;
code	ends
	end
