	page	95,132
;§∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞§
;§                                                                          §
;§            マルチカラム　コンパクト　プリント　ユーティリティ            §
;§                                                                          §
;§   Multicolumn Compact PRint utility   ＭＣＰＲ．ＥＸＥ  Ｖｅｒ１.４０    §
;§   ~           ~       ~~                                                 §
;§              Copyright (C) by 福地 邦雄 1989-1990. All rights reserved.  §
;§∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞§
	public	argv
	public	argc
	public	int24h
	public	intflg
	public	reprintflg
	extrn	getarg:near
	extrn	allocnambuf:near
	extrn	options:near
	extrn	allocprtbuf:near
	extrn	prtinit:near
	extrn	formprint:near
	extrn	freeprtbuf:near
	extrn	freenambuf:near
	extrn	newfile:near
	extrn	dosprint:near
	extrn	dosstdout:near
	extrn	abort:near
;
CR	equ	0dh
LF	equ	0ah
;
data	segment para	public	'DATA'
;
extrn	nameptr:dword
extrn	nameptroff:word
extrn	nameptrseg:word
extrn	fhandle:word
extrn	errorno:word
;
argv	dd	32 dup(?)
argc	dw	?
;
filecount   dw	0
;
psp	label	dword
pspoff	dw	0
pspseg	dw	0
;
devinfo	dw	?
breakflag	db	?
;
brkterm db	0ch
prtterm db	1ch,'$',22h,77h,1bh,'[; G',1ch,'(`',71h
prtrmsiz	equ	$-prtterm
brtrmsiz	equ	$-brkterm
;
prtend	db	9
prtfilename db	40 dup(' ')
	db	'  print end',CR,LF
endmsgsz    equ     $-prtend
;
helpmsg	label	byte
db '          マルチカラム コンパクト プリント              1990/02/07 Ver1.40',CR,LF
db '                     Copyright (C) by 福地 邦雄 1989-1990. All rights reserved.',CR,LF
db '使い方:MCPR <ｵﾌﾟｼｮﾝ> ﾌｧｲﾙ名･･･',CR,LF
db ' -xx      xxｶﾗﾑのﾏﾙﾁｶﾗﾑ印刷を行う           -Wxx    １ﾍﾟｰｼﾞの桁数',CR,LF
db ' -Nxx     xx桁の行番号を付ける              -Kxx    １ｶﾗﾑの桁数',CR,LF
db ' -H<ﾀｲﾄﾙ> ﾀｲﾄﾙを付ける 無指定時はﾌｧｲﾙ情報   -Gxx    ｶﾗﾑ間の空白桁数',CR,LF
db ' -P<A|B|C> ASM,BASIC,C のﾙｰﾙでｶﾗﾑ替えする   -Txx    ﾀﾌﾞｻｲｽﾞ',CR,LF
db ' -C       改ﾍﾟｰｼﾞｺｰﾄﾞを改行ｺｰﾄﾞとして扱う   -Lxx    １ﾍﾟｰｼﾞの印刷行数',CR,LF
db ' +xx-yy   xxﾍﾟｰｼﾞからyyﾍﾟｰｼﾞまで印刷        -Rxx    ﾍﾟｰｼﾞ替えを改行ｺｰﾄﾞで行う',CR,LF
db ' +xx,zz   xxﾍﾟｰｼﾞからzzﾍﾟｰｼﾞ分を印刷                    xxは１ﾍﾟｰｼﾞの物理行数',CR,LF
db ' -Fx,y,<W|SL|SP|AP|AL|BP|BL>                -Mxx,yy xxは左ﾏｰｼﾞﾝ yyは上ﾏｰｼﾞﾝ',CR,LF
db '   xは桁ﾋﾟｯﾁ       yは行ﾋﾟｯﾁ      以後は用紙指定',CR,LF
db '    1=136桁･10cpi   1=60行･6lpi    ﾄﾞｯﾄﾌﾟﾘﾝﾀ  W=136桁連帳  SL=80桁連帳  SP=A4縦',CR,LF
db '    2=204桁･15cpi   2=75行･7.5lpi  ﾍﾟｰｼﾞﾌﾟﾘﾝﾀ  AP=A4縦  AL=A4横',CR,LF
db '    3=272桁･20cpi   3=90行･9lpi                BP=B4縦  BL=B4横',CR,LF
db '桁ﾋﾟｯﾁ=1or2の時 行ﾋﾟｯﾁ=3は指定できない    用紙によって印刷行桁の初期値は変わる',CR,LF
db ' -?       標準書式の設定値を表示する        -Ux     ﾎｯﾊﾟｰﾕﾆｯﾄ指定',CR,LF
db '                                                                               ',CR,LF
hlpmsgsiz	equ	$-helpmsg
;
paperemp	db '用紙がありません.<書込み中> デバイス $'
writing		db '書込みができません. デバイス $'
selectopt	db '中止<A>, もう一度<R>, 無視<I>, ページ打ち直し<P>? $'
newline		db CR,LF,'$'
data	ends
;
code	segment para	public	'CODE'
	assume	cs:code,ds:data,ss:stack
int24h	dd	0
intflg	db	2 dup(0)
reprintflg	dw	0
dataseg	dw	data
	db	6 dup(0)
;
entry	proc	far
;
	mov	ax,seg	data
	mov	es,ax
	mov	es:pspseg,ds
	mov	ax,ds:[12h]
	mov	word ptr cs:int24h,ax
	mov	ax,ds:[14h]
	mov	word ptr cs:int24h+2,ax
;
	mov	di,offset argv
	call	getarg
	push	es
	pop	ds
	mov	argc,ax
	jz	noargs
;
	call	allocnambuf
	call	options
	jz	noprint
	mov	filecount,ax
;
	call	allocprtbuf
	call	sysalternate
prtloop:
	sub	filecount,1
	jb	endprint
;
	mov	ax,3d40h
	push	ds
	lds	si,nameptr
	lds	dx,[si]
	int	21h
	pop	ds
	jc	nextfile
;
	call	newfile
	call	formprint
;
	mov	ah,3eh
	mov	bx,fhandle
	int	21h
	call	prtendmsg
nextfile:
	add	nameptroff,4
	jmp	short	prtloop
endprint:
	call	sysrestore
	call	freeprtbuf
noprint:
	call	freenambuf
	mov	ax,4c00h
	int	21h
;
noargs:
	mov	errorno,0
	mov	cx,hlpmsgsiz
	mov	dx,offset helpmsg
	jmp	abort
;
entry	endp
;
sysalternate	proc
;
	mov	ax,3300h
	int	21h
	mov	breakflag,dl
;
	mov	ax,3301h
	mov	dl,1
	int	21h
;
	mov	ax,4400h
	mov	bx,4
	int	21h
	mov	dh,0
	mov	devinfo,dx
;
	mov	ax,4401h
	mov	bx,4
	or	dl,20h
	int	21h
;
	push	ds
	mov	ax,2523h
	mov	dx,offset int23proc
	push	cs
	pop	ds
	int	21h
;
	mov	ax,2524h
	mov	dx,offset int24proc
	int	21h
	pop	ds
;
	call	prtinit
;
	ret
;
sysalternate	endp
;
sysrestore  proc
;
	mov	ax,3301h
	mov	dl,breakflag
	int	21h
;
	mov	dx,offset prtterm
	mov	cx,prtrmsiz
	call	dosprint
;
	mov	ax,4401h
	mov	bx,4
	mov	dx,devinfo
	int	21h
;
	ret
;
sysrestore  endp
;
prtendmsg   proc
;
	cld
	xor	ax,ax
	mov	cx,-1
	les	di,nameptr
	les	di,es:[di]
	mov	si,di
  repne scasb
	not	cx
	dec	cx
	mov	bx,40
	sub	bx,cx
	jae	nonameover
	mov	bx,0
	mov	cx,40
nonameover:
	push	es
	mov	di,ds
	mov	es,di
	pop	ds
	mov	di,offset prtfilename
    rep movsb
	mov	al,' '
	mov	cx,bx
    rep stosb
	mov	di,es
	mov	ds,di
	mov	cx,endmsgsz
	mov	dx,offset prtend
	call	dosstdout
	ret
;
prtendmsg   endp
;
int23proc   proc
;
	test	cs:intflg,1
	jz	ctrlc
	iret
ctrlc:
	or	cs:intflg,1
	test	cs:intflg,40h
	jnz	fatalexit
;
	mov	ds,cs:dataseg
;
	mov	si,offset brkterm
	mov	cx,brtrmsiz
termoutloop:
	mov	ah,5
	mov	dl,[si]
	int	21h
	inc	si
	loop	termoutloop
;
	mov	ax,4401h
	mov	bx,4
	mov	dx,devinfo
	int	21h
fatalexit:
	mov	ax,4c01h
	int	21h
;
int23proc   endp
;
int24proc   proc
;
	test	cs:intflg,80h
	jnz	int24old
	test	ah,8
	jz	int24old
	cmp	di,9
	jb	int24old
	cmp	di,0ah
	ja	int24old
	push	bp
	mov	bp,sp
	cmp	byte ptr [bp+9],40h
	jne	intdefault
	cmp	word ptr [bp+0ah],4
	jne	intdefault
	push	ds
	mov	ds,[bp]
	test	byte ptr [si+5],80h
	pop	ds
	jnz	intfatal
intdefault:
	pop	bp
int24old:
	or	cs:intflg,80h
	jmp	cs:int24h
;
intfatal:
	pop	bp
	or	cs:intflg,0c0h
	push	ax
	push	bx
	push	cx
	push	dx
	push	si
	push	di
	push	bp
	push	ds
	push	es
	mov	bp,sp
;
	mov	ds,cs:dataseg
	cmp	di,9
	jne	writeerr
	mov	dx,offset paperemp
	jmp	short guide1out
writeerr:
	mov	dx,offset writing
guide1out:
	mov	ah,9
	int	21h
;
	mov	es,[bp+4]
	lea	si,[si+10]
	mov	cx,8
devnameloop:
	mov	ah,2
	mov	dl,es:[si]
	test	dl,dl
	jz	newlines
	cmp	dl,20h
	je	newlines
	int	21h
	inc	si
	loop	devnameloop
newlines:
	mov	ah,9
	mov	dx,offset newline
	int	21h
questions:
	mov	ah,9
	mov	dx,offset selectopt
	int	21h
;
	mov	ax,0c01h
	int	21h
;
	push	ax
	mov	ah,9
	mov	dx,offset newline
	int	21h
	pop	ax
;
	xor	ah,ah
	cmp	al,'I'
	je	oprdefault
	cmp	al,'i'
	je	oprdefault
	inc	ah
	cmp	al,'R'
	je	oprretry
	cmp	al,'r'
	je	oprretry
	inc	ah
	cmp	al,'A'
	je	oprdefault
	cmp	al,'a'
	je	oprdefault
	inc	ah
	cmp	al,'P'
	je	oprpagehead
	cmp	al,'p'
	je	oprpagehead
;
	jmp	questions
;
oprpagehead:
	mov	cs:reprintflg,-1
oprretry:
	and	cs:intflg,03fh
oprdefault:
	mov	[bp+10h],ah
;
	pop	es
	pop	ds
	pop	bp
	pop	di
	pop	si
	pop	dx
	pop	cx
	pop	bx
	pop	ax
	iret
;
int24proc   endp
;
code	ends
;
stack	segment	para	stack	'STACK'
	db	400h dup(?)
stack	ends
	end	entry
