;SHNECHI.ASM(初期化部)1992.01.16
.8086
page    ,130
comment +

        ShNEch(SHow NEC98 CHaracters しねっち)(C)1991．Boko

        NEC98 特殊文字を TOWNSで表示するツール

        SHNECHI(初期化部)

        ワークエリアをクリアし
        int91のベクタアドレスの内容を比較して
        既に常駐しているときはメモリを開放して終了
        まだ常駐していないときは常駐終了する

  90/12/27 V0.5 メール配付版
  91/01/14 V0.6 DL公開版 /R /S オプションを追加
　91/04/12 V0.7 バグ修正(PSE/FMR R4.60との併用で暴走する)
　92/01/15 V0.7 SHOJISの分を挿入
　92/01/16 V0.7 SHONECの分を挿入
  92/01/31      SHNECHの分を挿入 for free software collection 5

+
INCLUDE		SHNECH.H

EXTRN		MACHINE_NAME:	BYTE
EXTRN		ENV_SEGMENT:	WORD
EXTRN		PARAM_LENGTH:	BYTE
EXTRN		PARAM_LINE:	BYTE
EXTRN		WORK:		BYTE
EXTRN		WORKSIZE:	ABS
EXTRN		INT_91_VECT:	DWORD
EXTRN		INT_91_SEG:	WORD
EXTRN		INT_91_OFF:	WORD
EXTRN		SHOACH_ENT:	NEAR
EXTRN		STAY_MAIN:	FAR
EXTRN		TABLE_NAME:	BYTE

PUBLIC		INITIALIZE

INT_NO		EQU		91H

CODE	SEGMENT PARA PUBLIC 'SHOACHCOM'
                ASSUME  CS:CODE
                ASSUME  DS:CODE
                ASSUME  ES:CODE

;		初期化部
;		~~~~~~~~
INITIALIZE	PROC	NEAR

;		パラメータ解析
;		~~~~~~~~~~~~~~
		MOV	SI,offset PARAM_LINE
SKIP_BLANK:	LODSB
		CMP	AL,00DH
		JE	CLR_WORK
		CMP	AL,020H
		JE	SKIP_BLANK
		LODSB
		CMP	AL,'S'
		JE	S_FUNC
		CMP	AL,'s'
		JE	S_FUNC
		CMP	AL,'R'
		JE	R_FUNC
		CMP	AL,'r'
		JE	R_FUNC
		MOV	DX,offset HELP_MSG
		JMP SHORT TERM_PROC1

;		R オプション
;		~~~~~~~~~~~~
R_FUNC:
		CALL	STAY_CHK
		JE	REMOVE
		JMP SHORT TERM_PROC0

;		S オプション
;		~~~~~~~~~~~~
S_FUNC:
		CALL	STAY_CHK
		PUSH	CS
		POP	ES
		JNE	CLR_WORK
		MOV	DX,offset CONT_MSG
		JMP SHORT TERM_PROC1
		
;		ワーククリア
;		~~~~~~~~~~~~
CLR_WORK:
		XOR	AX,AX
		MOV	DI,offset WORK
		MOV	CX,WORKSIZE
		REP STOSB

;		常駐チェック
;		~~~~~~~~~~~~
		CALL	STAY_CHK
		JNE	START_SHOACH

;		常駐解除
;		~~~~~~~~
;		ES:常駐部のセグメント
REMOVE:
		PUSH	DS
		LDS	DX,ES:INT_91_VECT;元のBIOSベクトルをDS:DXに取得
		MOV	AX,(25H SHL 8)OR INT_NO	;DS:DXで割り込みベクトル設定
		INT	21H		;system call
		MOV	AH,49H		;ES:のメモリブロックを開放
		INT	21H		;system call
		POP	DS

;		終了
;		~~~~
TERM_PROC0:
		MOV	DX,offset REMOVE_MSG
TERM_PROC1:
		CALL	PUTS
		MOV	AX,04C00H	;プロセス終了（リタンコード０）
		INT	21H		;system call

;		常駐開始
;		~~~~~~~~
;		ES:BX 91H BIOS ベクトル
START_SHOACH:
		MOV	INT_91_OFF,BX	;現BIOSベクトルを保存
		MOV	INT_91_SEG,ES
;		SHOACH内部にベクトルを設定
		MOV	DX,offset STAY_MAIN
		MOV	AX,(25H SHL 8)OR INT_NO	;DS:DXで割り込みベクトル設定
		INT	21H		;system call
;		環境ブロックを開放
		MOV	ES,ENV_SEGMENT	;環境セグメント
		MOV	AH,49H		;ES:のメモリブロックを開放
		INT	21H		;system call

		XOR	AX,AX
		MOV	ENV_SEGMENT,AX	;◎h!FＭ '90.12月号 P.148(注8)を参照

;		終了
;		~~~~
		MOV	DX,offset STAY_MSG
		CALL	PUTS
		MOV	DX,offset TABLE_NAME
		ADD	DX,15
		MOV	CL,4
		SHR	DX,CL
		MOV	AX,03100H	;プロセス常駐終了（リタンコード０）
		INT	21H		;system call

INITIALIZE	ENDP

;		メッセージ表示(DOS call)
;		~~~~~~~~~~~~~~~~~~~~~~~~
PUTS		PROC	NEAR
		PUSH	ES
		PUSH	CS
		POP	ES
		MOV	DI,offset PARAM_LINE
		MOV	SI,offset MSG1
		CALL	MOVSTR0
		MOV	SI,offset TABLE_NAME
		CALL	MOVSTR0
		MOV	SI,offset MSG2
		CALL	MOVSTR0
		MOV	SI,DX
		CALL	MOVSTR0
		MOV	SI,offset MSG3
		CALL	MOVSTR0
		MOV	DX,offset PARAM_LINE
		MOV	AH,09H
		INT	21H
		POP	ES
		RET

MOVSTR		PROC
		STOSB
MOVSTR0:	LODSB
		CMP	AL,0
		JNE	MOVSTR
		RET
MOVSTR		ENDP

PUTS		ENDP

;		常駐チェック
;		~~~~~~~~~~~~
STAY_CHK	PROC	NEAR
		MOV	AX,(35H SHL 8)OR INT_NO	;ES:BXに割り込みベクトル取得
		INT	21H		;system call
		MOV	DI,offset SHOACH_ENT
		MOV	SI,DI
		MOV	CX,10
		REPZ	CMPSB		;Z:すでに常駐,NZ:まだ常駐してない
		RET
STAY_CHK	ENDP

;		メッセージ
;		~~~~~~~~~~
if	SHOACH
MSG1		DB 'SHOACH V0.7 for FM',0
MSG2		DB ' (C)1991. Boko',0DH,0AH
		DB 'OASYS特殊文字の表示を',0
MSG3	 	DB 'します。'
		DB 0DH,0AH,'$',0
endif
if	SHOJIS
MSG1		DB 'SHOJIS V0.7 for ',0
MSG2		DB ' (C)1992. Boko',0DH,0AH
		DB ' JIS罫線の表示を',0
MSG3	 	DB 'します。'
		DB 0DH,0AH,'$',0
endif
if	SHONEC
MSG1		DB 'SHONEC V0.71 for ',0
MSG2		DB ' (C)1992. Boko',0DH,0AH
		DB ' NEC特殊文字の表示を',0
MSG3	 	DB 'します。'
		DB 0DH,0AH,'$',0
endif
if	SHNECH
MSG1		DB 'SHNECH V0.71 for ',0
MSG2		DB ' (C)1992. Boko',0DH,0AH
		DB ' NEC特殊文字の表示を',0
MSG3	 	DB 'します。'
		DB 0DH,0AH,'$',0
endif
STAY_MSG	DB '開始',0
REMOVE_MSG	DB '終了',0
CONT_MSG	DB '継続',0
HELP_MSG	DB 'する常駐プログラムです。',0DH,0AH,0AH
if	SHOACH
		DB '使い方: SHOACH [/S][/R]',0DH,0AH
		DB 09H,'SHOACH    :開始/終了',0DH,0AH
endif
if	SHOJIS
		DB '使い方: SHOJIS [/S][/R]',0DH,0AH
		DB 09H,'SHOJIS    :開始/終了',0DH,0AH
endif
if	SHONEC
		DB '使い方: SHONEC [/S][/R]',0DH,0AH
		DB 09H,'SHONEC    :開始/終了',0DH,0AH
endif
if	SHNECH
		DB '使い方: SHNECH [/S][/R]',0DH,0AH
		DB 09H,'SHONEC    :開始/終了',0DH,0AH
endif
		DB 09H,09H,'/S:開始します。',0DH,0AH
		DB 09H,09H,'/R:終了',0
		DB 40H,28H,23H,29H	;WHAT.COM対応
if	SHOACH
	 	DB 'SHOACH.com for FMR ver0.70 (C)1991. Boko'
endif
if	SHOJIS
	 	DB 'SHOJIS.com for OASYS ver0.70 (C)1992. Boko'
endif
if	SHONEC
	 	DB 'SHONEC.com for OASYS ver0.71 (C)1992. Boko'
endif
if	SHNECH
	 	DB 'SHNECH.com for TOWNS ver0.71 (C)1992. Boko'
endif
		DB 00H,0DH,0AH,'$'

CODE		ENDS
		END
