戻る
; "PARTST.ASM" PC-9801UV11 make by R.H 1989/12/08
;
;
;	パーツデータGET&PUT
;
;		SSGR0 : visual data segment plean 0
;		SSGR1 : visual data segment plean 1
;		SSGR2 : visual data segment plean 2
;		SSGR3 : visual data segment plean 3
;
;	高度なテクニックを使う場合
;
;	・マスクパーツのPUTプレーンの設定
;		CALL PATMST(PARTT2.ASM) を呼び出して下さい
;
;	・ORでPUTするプレーンの設定
;		DS:BORRCL:WORD を設定して下さい
;		(詳細はPLSLD3.ASM/UNPORを参照のこと)
;
;	・オーバラップは PATEFC(パーツPUTエフェクト)を使用して下さい
;	例)	MOV	AX,1		; 1=パターンPUTオーバラップ
;		CALL	PATEFC		; パーツPUTエフェクト
;		(オーバラップは縦圧縮時のみ可能)
;		オーバラップ単位時間の変更はBBOVTM(オーバラップタイム)を変更
;
;	・PATOPE(オペレーションセット)の
;		単プレーンパターンのORPUTとはデータ中の先頭の1プレーン分
;		だけのデータを全プレーンへセットする機能です
;
;	・プレーン毎のスキップを行えるようにしました。これは縦/横圧縮モード
;	 (PLSMDE=0:通常,1:縦方向) オーバラップ時(BBOVLP)のいずれでも使えます。
;	例)	MOV	DX,1000B	; スキッププレーン (bit3:plean3...)
;		CALL	PLSSKP		; パーツPUTのプレーンスキップ
;
;
; public subroutine.

;	DTA領域の長さと合わせてあるので
;	変更の際には注意してください

;*NON*;PARTS_BUFF_LEN	EQU	65000	; パーツデータバッファサイズ


;	パーツバッファのオフセット値

PARTS_OFST_ATR	EQU	0	; 属性(0=データ終わり,
				;      1=無圧縮データ,2=圧縮データ)
PARTS_OFST_X	EQU	2	; X座標
PARTS_OFST_Y	EQU	4	; Y座標
PARTS_OFST_LNX	EQU	6	; X長さ
PARTS_OFST_LNY	EQU	8	; Y長さ
PARTS_OFST_LEN	EQU	10	; データ長さ
PARTS_OFST_DAT	EQU	12	; データ開始オフセット



CODE	SEGMENT	PUBLIC	'CODE'
	ASSUME	CS:CODE,DS:DATA

PUBLIC	PATINI		; パーツセット初期処理
PUBLIC	PATCLR		; パーツセットクリア
;*NON*;PUBLIC	PATGET	; パーツGET
PUBLIC	PATGTA		; パーツGET圧縮無し
PUBLIC	PATGTC		; パーツGET圧縮無し番号指定
PUBLIC	PATPUT		; パーツPUT
PUBLIC	PATPTX		; パーツPUT座標指定
PUBLIC	PATPTF		; パーツPUTオフセット指定
;*NON*;PUBLIC	PATSAV	; パーツセーブ
PUBLIC	PATLOD		; パーツロード
PUBLIC	PATLDA		; パーツ追加ロード
PUBLIC	PATBNK		; バンクチェンジ
PUBLIC	PATOPE		; オペレーションセット(オペレーション 0=normal,1=OR )
PUBLIC	PATCPY		; パーツコピー
PUBLIC	PATEFC		; パーツPUTエフェクト


EXTRN	UNPLS:NEAR		; データ復元
;*NON*;EXTRN	PLESS:NEAR	; データ圧縮

EXTRN	UNPOR:NEAR		; データ復元(OR処理)
EXTRN	UNPORS:NEAR		; データ復元(OR処理)単プレーンパターン

EXTRN	VRMGT:NEAR		; VRAMデータGET
EXTRN	VRMPT:NEAR		; VRAMデータPUT

EXTRN	DSKLD:NEAR		; load data.
;*NON*;EXTRN	DSKSV:NEAR	; save data.




;	パーツセット初期処理

PATINI	PROC	NEAR
				; デフォルトのパーツバッファ#0
	MOV	AX,SEGPAT0	; セグメント
	MOV	BX,TOPPAT0	; 先頭オフセット
	MOV	CX,ENDPAT0	; 終了オフセット

	MOV	PRSSEG,AX	; バンクセグメント
	MOV	PRSTOP,BX	; バンクトップオフセット
	MOV	PRSEND,CX	; バンクエンドオフセット

	CALL	PATCLR		; パーツセットクリア
	RET
PATINI	ENDP



;	パーツセットクリア

PATCLR	PROC	NEAR
	PUSH	ES

		; パーツバッファのカレントポインタ
	MOV	AX,PRSTOP		; バンクトップオフセット
	MOV	PRSOFS,AX		;

		; パーツバッファの使用サイズ
	MOV	PRSSIZ,0

	MOV	AX,PRSSEG		; バンクセグメント
	MOV	ES,AX			;

	;	属性(0=データ終わり,1=無圧縮データ,2=圧縮データ)

	MOV	ES:[PARTS_OFST_ATR],WORD PTR 0

	POP	ES
	RET
PATCLR	ENDP



;	パーツGET圧縮無し
;	-I- VRX		: VRAM X座標
;	    VRY		: VRAM Y座標
;	    VRLENX	: X方向長さ
;	    VRLENY	: Y方向長さ
;	-O- AX		: 0=normal end, 1=error.
;	    BX    	: 格納データ番号

PATGTA	PROC	NEAR
	PUSH	CX

	MOV	CX,0FFFFH		;
	CALL	PARTSCH			; パーツデータの検索
	MOV	PRSOFS,DI		; パーツバッファのカレントポインタ
	SUB	DI,PRSTOP		; バンクトップオフセット
	MOV	PRSSIZ,DI		; パーツバッファの使用サイズ

	MOV	AX,PRSSEG		; バンクセグメント
	MOV	ES,AX			;

	MOV	DI,PRSOFS ; パーツバッファのカレントポインタ

	MOV	AX,VRX				; VRAM X座標
	MOV	ES:[DI][PARTS_OFST_X],AX	; X座標
	MOV	AX,VRY				; VRAM Y座標
	MOV	ES:[DI][PARTS_OFST_Y],AX	; Y座標
	MOV	AX,VRLENX			; X方向長さ
	MOV	ES:[DI][PARTS_OFST_LNX],AX	; X長さ
	MOV	AX,VRLENY			; Y方向長さ
	MOV	ES:[DI][PARTS_OFST_LNY],AX	; Y長さ

	MOV	BPNTOF,DI		; データバッファポインタ
	ADD	BPNTOF,PARTS_OFST_DAT	; データ開始オフセット
	MOV	AX,PRSSEG		; バンクセグメント
	MOV	BPNTSG,AX		;
	MOV	AX,PRSEND		; バンクエンドオフセット
	SUB	AX,BPNTOF		; データ開始オフセット
	MOV	BCNTMX,AX		; データ最大長さ

	PUSH	BX
	PUSH	DI
	PUSH	ES
	CALL	VRMGT			; VRAMデータGET
	POP	ES
	POP	DI
	POP	BX

	CMP	AH,1	; 0 or 2 : normal end. 1:write error.
	JE	PATGTA_ERROR

	MOV	AX,BCOUNT			; データ長さ
	MOV	ES:[DI][PARTS_OFST_LEN],AX	; データ長さ

	MOV	AX,BCOUNT		; データ長さ
	ADD	AX,PARTS_OFST_DAT	; データ開始オフセット
	ADD	PRSSIZ,AX	; パーツバッファの使用サイズ

	;	属性(0=データ終わり,1=無圧縮データ,2=圧縮データ)
	MOV	ES:[DI][PARTS_OFST_ATR],WORD PTR 1

	MOV	DI,BPOINT 		; データ終わりアドレス+1
	MOV	ES:[DI][PARTS_OFST_ATR],WORD PTR 0

	MOV	PRSOFS,DI ; パーツバッファのカレントポインタ
PATGTA_EXIT:
	MOV	AX,0	; normal.
	POP	CX
	RET
PATGTA_ERROR:
	MOV	AX,1	; buffer full.
	POP	CX
	RET
PATGTA	ENDP



;	パーツGET圧縮無し番号指定
;	-I- VRX		: VRAM X座標
;	    VRY		: VRAM Y座標
;	    VRLENX	: X方向長さ
;	    VRLENY	: Y方向長さ
;	    CX          :
;	-O- AX		: 0=normal end, 1=error.
;	    BX    	: 格納データ番号

PATGTC	PROC	NEAR
	PUSH	CX

	CALL	PARTSCH			; パーツデータの検索
	MOV	PRSOFS,DI		; パーツバッファのカレントポインタ
	SUB	DI,PRSTOP		; バンクトップオフセット
	MOV	PRSSIZ,DI		; パーツバッファの使用サイズ

	MOV	AX,PRSSEG		; バンクセグメント
	MOV	ES,AX			;

	MOV	DI,PRSOFS ; パーツバッファのカレントポインタ

	MOV	AX,VRX				; VRAM X座標
	MOV	ES:[DI][PARTS_OFST_X],AX	; X座標
	MOV	AX,VRY				; VRAM Y座標
	MOV	ES:[DI][PARTS_OFST_Y],AX	; Y座標
	MOV	AX,VRLENX			; X方向長さ
	MOV	ES:[DI][PARTS_OFST_LNX],AX	; X長さ
	MOV	AX,VRLENY			; Y方向長さ
	MOV	ES:[DI][PARTS_OFST_LNY],AX	; Y長さ

	MOV	BPNTOF,DI		; データバッファポインタ
	ADD	BPNTOF,PARTS_OFST_DAT	; データ開始オフセット
	MOV	AX,PRSSEG		; バンクセグメント
	MOV	BPNTSG,AX		;
	MOV	AX,PRSEND		; バンクエンドオフセット
	SUB	AX,BPNTOF		; データ開始オフセット
	MOV	BCNTMX,AX		; データ最大長さ

	PUSH	BX
	PUSH	DI
	PUSH	ES
	CALL	VRMGT			; VRAMデータGET
	POP	ES
	POP	DI
	POP	BX

	CMP	AH,1	; 0 or 2 : normal end. 1:write error.
	JE	PATGTC_ERROR

	MOV	AX,BCOUNT			; データ長さ
	MOV	ES:[DI][PARTS_OFST_LEN],AX	; データ長さ

	MOV	AX,BCOUNT		; データ長さ
	ADD	AX,PARTS_OFST_DAT	; データ開始オフセット				ADD	PRSSIZ,AX	; パーツバッファの使用サイズ

	;	属性(0=データ終わり,1=無圧縮データ,2=圧縮データ)
	MOV	ES:[DI][PARTS_OFST_ATR],WORD PTR 1

	MOV	DI,BPOINT 		; データ終わりアドレス+1
	MOV	ES:[DI][PARTS_OFST_ATR],WORD PTR 0

	MOV	PRSOFS,DI ; パーツバッファのカレントポインタ
PATGTC_EXIT:
	MOV	AX,0	; normal.
	POP	CX
	RET
PATGTC_ERROR:
	MOV	AX,1	; buffer full.
	POP	CX
	RET
PATGTC	ENDP


;*NON*;
;*NON*;;	パーツGET
;*NON*;;	-I- VRX		: VRAM X座標
;*NON*;;	    VRY		: VRAM Y座標
;*NON*;;	    VRLENX	: X方向長さ
;*NON*;;	    VRLENY	: Y方向長さ
;*NON*;;	-O- AX		: 0=normal end, 1=error.
;*NON*;
;*NON*;PATGET	PROC	NEAR
;*NON*;	PUSH	CX
;*NON*;
;*NON*;	MOV	AX,PRSSEG		; バンクセグメント
;*NON*;	MOV	ES,AX			;
;*NON*;
;*NON*;	MOV	DI,PRSOFS ; パーツバッファのカレントポインタ
;*NON*;
;*NON*;	;	データ圧縮
;*NON*;	MOV	AX,VRX				; VRAM X座標
;*NON*;	MOV	ES:[DI][PARTS_OFST_X],AX	; X座標
;*NON*;	MOV	AX,VRY				; VRAM Y座標
;*NON*;	MOV	ES:[DI][PARTS_OFST_Y],AX	; Y座標
;*NON*;	MOV	AX,VRLENX			; X方向長さ
;*NON*;	MOV	ES:[DI][PARTS_OFST_LNX],AX	; X長さ
;*NON*;	MOV	AX,VRLENY			; Y方向長さ
;*NON*;	MOV	ES:[DI][PARTS_OFST_LNY],AX	; Y長さ
;*NON*;
;*NON*;	MOV	BPNTOF,DI		; データバッファポインタ
;*NON*;	ADD	BPNTOF,PARTS_OFST_DAT	; データ開始オフセット
;*NON*;	MOV	AX,PRSSEG		; バンクセグメント
;*NON*;	MOV	BPNTSG,AX		;
;*NON*;	MOV	AX,PRSEND		; バンクエンドオフセット
;*NON*;	SUB	AX,BPNTOF		; データ開始オフセット
;*NON*;	MOV	BCNTMX,AX		; データ最大長さ
;*NON*;
;*NON*;	PUSH	DI
;*NON*;	PUSH	ES
;*NON*;	CALL	PLESS			; データ圧縮
;*NON*;	POP	ES
;*NON*;	POP	DI
;*NON*;
;*NON*;	CMP	AH,1	; 0 or 2 : normal end. 1:write error.
;*NON*;	JE	PATGET_ERROR
;*NON*;
;*NON*;	MOV	AX,BCOUNT			; データ長さ
;*NON*;	MOV	ES:[DI][PARTS_OFST_LEN],AX	; データ長さ
;*NON*;
;*NON*;	MOV	AX,BCOUNT		; データ長さ
;*NON*;	ADD	AX,PARTS_OFST_DAT
;*NON*;	ADD	PRSSIZ,AX	; パーツバッファの使用サイズ
;*NON*;
;*NON*;	;	属性(0=データ終わり,1=無圧縮データ,2=圧縮データ)
;*NON*;	MOV	ES:[DI][PARTS_OFST_ATR],WORD PTR 2
;*NON*;
;*NON*;	MOV	DI,BPOINT 		; データ終わりアドレス+1
;*NON*;	MOV	ES:[DI][PARTS_OFST_ATR],WORD PTR 0
;*NON*;
;*NON*;	MOV	PRSOFS,DI ; パーツバッファのカレントポインタ
;*NON*;PATGET_EXIT:
;*NON*;	MOV	AX,0	; normal.
;*NON*;	POP	CX
;*NON*;	RET
;*NON*;PATGET_ERROR:
;*NON*;	MOV	AX,1	; buffer full.
;*NON*;	POP	CX
;*NON*;	RET
;*NON*;PATGET	ENDP
;*NON*;
;*NON*;


;	パーツPUT
;	-I- CX : パーツ番号
;	-O- AX : 0=normal end, 1=error.

PATPUT	PROC	NEAR
	PUSH	CX

	CALL	PARTSCH		; パーツデータの検索
	CMP	AX,0		;
	JE	PATPUT1		;
	JMP	PATPUT_ERROR	;
PATPUT1:
	;	データ復元
	MOV	AX,ES:[DI][PARTS_OFST_X]	; X座標
	MOV	VRX,AX				; VRAM X座標
	MOV	AX,ES:[DI][PARTS_OFST_Y]	; Y座標
	MOV	VRY,AX				; VRAM Y座標
	MOV	AX,ES:[DI][PARTS_OFST_LNX]	; X長さ
	MOV	VRLENX,AX			; X方向長さ
	MOV	AX,ES:[DI][PARTS_OFST_LNY]	; Y長さ
	MOV	VRLENY,AX			; Y方向長さ

	MOV	BPNTOF,DI		; データバッファポインタ
	ADD	BPNTOF,PARTS_OFST_DAT	; データ開始オフセット

	MOV	AX,PRSSEG		; バンクセグメント
	MOV	BPNTSG,AX		;
	MOV	AX,ES:[DI][PARTS_OFST_LEN]	; データ長さ
	MOV	BCNTMX,AX			; データ最大長さ

	CMP	ES:[DI][PARTS_OFST_ATR],WORD PTR 1 ; 属性(0=データ終わり,
						; 1=無圧縮データ,2=圧縮データ)
	JNE	PATPUT5				;
	CALL	VRMPT				; VRAMデータPUT
	JMP	PATPUT_EXIT			;
PATPUT5:
	CMP	ES:[DI][PARTS_OFST_ATR],WORD PTR 2 ; 属性(0=データ終わり,
						; 1=無圧縮データ,2=圧縮データ)
	JNE	PATPUT6				;

	CMP	PRSOPE,0			; PUT時オペレーション
	JNE	PATPUT55			; 0=normal,1=OR,2=OR2
	CALL	UNPLS				; データ復元
	JMP	PATPUT_EXIT			;
PATPUT55:
	CMP	PRSOPE,1			; PUT時オペレーション
	JNE	PATPUT56			; 0=normal,1=OR,2=OR2
	CALL	UNPOR				; データ復元(OR処理)
	JMP	PATPUT_EXIT			;
PATPUT56:
	CMP	PRSOPE,2			; PUT時オペレーション
	JNE	PATPUT6				; 0=normal,1=OR,2=OR2
	CALL	UNPORS				; データ復元(OR処理)
						; 単プレーンパターン
	JMP	PATPUT_EXIT			;
PATPUT6:

PATPUT_EXIT:
	MOV	AX,0	; normal.
	POP	CX
	RET
PATPUT_ERROR:
	MOV	AX,1	; not found.
	POP	CX
	RET
PATPUT	ENDP



;	パーツPUT座標指定
;	-I- CX  : パーツ番号
;	    VRX	: VRAM X座標
;	    VRY : VRAM Y座標
;	-O- AX  : 0=normal end, 1=error.

PATPTX	PROC	NEAR
	PUSH	CX

	CALL	PARTSCH		; パーツデータの検索
	CMP	AX,0		;
	JE	PATPTX1		;
	JMP	PATPTX_ERROR	;
PATPTX1:
	;	属性(0=データ終わり,1=無圧縮データ,2=圧縮データ)
	MOV	DX,ES:[DI][PARTS_OFST_ATR]
	CMP	DX,0
	JNE	PATPTX44
	JMP	PATPTX_ERROR			; end of data.
PATPTX44:
	;	データ復元
	MOV	AX,ES:[DI][PARTS_OFST_LNX]	; X長さ
	MOV	VRLENX,AX			; X方向長さ
	MOV	AX,ES:[DI][PARTS_OFST_LNY]	; Y長さ
	MOV	VRLENY,AX			; Y方向長さ

	MOV	BPNTOF,DI		; データバッファポインタ
	ADD	BPNTOF,PARTS_OFST_DAT	; データ開始オフセット
	MOV	AX,PRSSEG		; バンクセグメント
	MOV	BPNTSG,AX		;

	MOV	AX,ES:[DI][PARTS_OFST_LEN]	; データ長さ
	MOV	BCNTMX,AX			; データ最大長さ

	CMP	ES:[DI][PARTS_OFST_ATR],WORD PTR 1 ; 属性(0=データ終わり,
						; 1=無圧縮データ,2=圧縮データ)
	JNE	PATPTX5				;
	CALL	VRMPT				; VRAMデータPUT
	JMP	PATPTX_EXIT			;
PATPTX5:
	CMP	ES:[DI][PARTS_OFST_ATR],WORD PTR 2 ; 属性(0=データ終わり,
						; 1=無圧縮データ,2=圧縮データ)
	JNE	PATPTX6				;

	CMP	PRSOPE,0			; PUT時オペレーション
	JNE	PATPTX55			; 0=normal,1=OR
	CALL	UNPLS				; データ復元
	JMP	PATPTX_EXIT			;
PATPTX55:
	CMP	PRSOPE,1			; PUT時オペレーション
	JNE	PATPTX56			; 0=normal,1=OR,2=OR2
	CALL	UNPOR				; データ復元(OR処理)
	JMP	PATPTX_EXIT			;
PATPTX56:
	CMP	PRSOPE,2			; PUT時オペレーション
	JNE	PATPTX6				; 0=normal,1=OR,2=OR2
	CALL	UNPORS				; データ復元(OR処理)
						; 単プレーンパターン
	JMP	PATPTX_EXIT			;
PATPTX6:
PATPTX_EXIT:
	MOV	AX,0	; normal.
	POP	CX
	RET
PATPTX_ERROR:
	MOV	AX,1	; not found.
	POP	CX
	RET
PATPTX	ENDP



;	パーツPUTオフセット指定
;	-I-   CX  : パーツ番号
;	-I/O- VRX : VRAM X座標
;	      VRY : VRAM Y座標
;	-O-   AX  : 0=normal end, 1=error.

PATPTF	PROC	NEAR
	PUSH	CX

	CALL	PARTSCH		; パーツデータの検索
	CMP	AX,0		;
	JE	PATPTF1		;
	JMP	PATPTF_ERROR	;
PATPTF1:
	;	属性(0=データ終わり,1=無圧縮データ,2=圧縮データ)
	MOV	DX,ES:[DI][PARTS_OFST_ATR]
	CMP	DX,0
	JNE	PATPTF44
	JMP	PATPTF_ERROR			; end of data.
PATPTF44:
	;	データ復元
	MOV	AX,ES:[DI][PARTS_OFST_X]	; X座標
	ADD	VRX,AX				; VRAM X座標
	MOV	AX,ES:[DI][PARTS_OFST_Y]	; Y座標
	ADD	VRY,AX				; VRAM Y座標

	MOV	AX,ES:[DI][PARTS_OFST_LNX]	; X長さ
	MOV	VRLENX,AX			; X方向長さ
	MOV	AX,ES:[DI][PARTS_OFST_LNY]	; Y長さ
	MOV	VRLENY,AX			; Y方向長さ

	MOV	BPNTOF,DI		; データバッファポインタ
	ADD	BPNTOF,PARTS_OFST_DAT	; データ開始オフセット
	MOV	AX,PRSSEG		; バンクセグメント
	MOV	BPNTSG,AX		;

	MOV	AX,ES:[DI][PARTS_OFST_LEN]	; データ長さ
	MOV	BCNTMX,AX			; データ最大長さ

	CMP	ES:[DI][PARTS_OFST_ATR],WORD PTR 1 ; 属性(0=データ終わり,
						; 1=無圧縮データ,2=圧縮データ)
	JNE	PATPTF5				;
	CALL	VRMPT				; VRAMデータPUT
	JMP	PATPTF_EXIT			;
PATPTF5:
	CMP	ES:[DI][PARTS_OFST_ATR],WORD PTR 2 ; 属性(0=データ終わり,
						; 1=無圧縮データ,2=圧縮データ)
	JNE	PATPTF6				;

	CMP	PRSOPE,0			; PUT時オペレーション
	JNE	PATPTF55			; 0=normal,1=OR
	CALL	UNPLS				; データ復元
	JMP	PATPUT_EXIT			;
PATPTF55:
	CMP	PRSOPE,1			; PUT時オペレーション
	JNE	PATPTF56			; 0=normal,1=OR,2=OR2
	CALL	UNPOR				; データ復元(OR処理)
	JMP	PATPTF_EXIT			;
PATPTF56:
	CMP	PRSOPE,2			; PUT時オペレーション
	JNE	PATPTF6				; 0=normal,1=OR,2=OR2
	CALL	UNPORS				; データ復元(OR処理)
						; 単プレーンパターン
	JMP	PATPTF_EXIT			;
PATPTF6:
PATPTF_EXIT:
	MOV	AX,0	; normal.
	POP	CX
	RET
PATPTF_ERROR:
	MOV	AX,1	; not found.
	POP	CX
	RET
PATPTF	ENDP


;*NON*;
;*NON*;;	パーツセーブ
;*NON*;;	-I- DS:SI : ファイル名
;*NON*;;	-o- AX    : 0:normal.
;*NON*;;	            1:error.
;*NON*;
;*NON*;PATSAV	PROC	NEAR
;*NON*;	CALL	PAT_FLNSET	; パーツファイル名セット
;*NON*;
;*NON*;	MOV	DI,PRSTOP		; バンクトップオフセット
;*NON*;	MOV	DX,PRSSEG		; バンクセグメント
;*NON*;	MOV	CX,PRSSIZ	; パーツバッファの使用サイズ
;*NON*;	MOV	SI,OFFSET FLPNAM	; パレットファイル名
;*NON*;	CALL	DSKSV			; file save.
;*NON*;
;*NON*;	RET
;*NON*;PATSAV	ENDP
;*NON*;


;	パーツロード
;	-I- DS:SI : ファイル名
;	-o- AX    : 0:normal.
;	            1:error.

PATLOD	PROC	NEAR
	CALL	PAT_FLNSET		; パーツファイル名セット

	MOV	DI,PRSTOP		; バンクトップオフセット
	MOV	DX,PRSSEG		; バンクセグメント
	MOV	CX,PRSEND		; バンクエンドオフセット
	SUB	CX,PRSTOP		; バンクトップオフセット
					; CX=パーツデータバッファサイズ
	MOV	SI,OFFSET FLPNAM	; パレットファイル名
	CALL	DSKLD			; file load.

	PUSH	AX

	MOV	CX,0FFFFH		;
	CALL	PARTSCH			; パーツデータの検索
	MOV	PRSOFS,DI	; パーツバッファのカレントポインタ

	SUB	DI,PRSTOP		; バンクトップオフセット
	MOV	PRSSIZ,DI	; パーツバッファの使用サイズ

	POP	AX

	RET
PATLOD	ENDP


;	パーツ追加ロード
;	-I- DS:SI : ファイル名
;	-o- AX    : 0:normal.
;	            1:error.

PATLDA	PROC	NEAR
	CALL	PAT_FLNSET		; パーツファイル名セット

	MOV	CX,0FFFFH		;
	CALL	PARTSCH			; パーツデータの検索

	MOV	CX,PRSEND		; バンクエンドオフセット
	SUB	CX,DI			;

	MOV	DX,PRSSEG		; バンクセグメント

	MOV	SI,OFFSET FLPNAM	; パレットファイル名
	CALL	DSKLD			; file load.

	PUSH	AX

	MOV	CX,0FFFFH		;
	CALL	PARTSCH			; パーツデータの検索

	MOV	ES:[DI][PARTS_OFST_ATR],WORD PTR 0 ; データエンド

	MOV	PRSOFS,DI	; パーツバッファのカレントポインタ

	SUB	DI,PRSTOP		; バンクトップオフセット
	MOV	PRSSIZ,DI	; パーツバッファの使用サイズ

	POP	AX

	RET
PATLDA	ENDP



;	バンクチェンジ
;	-I- DX : バンク番号(0ー3)

PATBNK	PROC	NEAR

	MOV	PRSBNK,DX		; バンク番号

	CALL	BNKNUM			; バンクアドレスGET

	MOV	PRSSEG,AX		; バンクセグメント
	MOV	PRSTOP,BX		; バンクトップオフセット
	MOV	PRSEND,CX		; バンクエンドオフセット

	RET
PATBNK	ENDP



;	オペレーションセット
;	0:normal   通常のPUT
;	1:OR       ORPUT
;	2:OR2      単プレーンパターンのORPUT
;	-I- DX : PUT時オペレーション ( 0=normal,1=OR,2=OR2 )

PATOPE	PROC	NEAR

	MOV	PRSOPE,DX		; PUT時オペレーション
					; 0=normal,1=OR
	RET
PATOPE	ENDP



;	パーツコピー
;	-I- AX : バンク番号コピー元
;	    BX : バンク番号コピー先
;	    CX : コピー長さ

PATCPY	PROC	NEAR

	PUSH	CX

	PUSH	AX

	MOV	DX,BX			; バンク番号コピー先
	CALL	BNKNUM			; バンクアドレスGET

	MOV	ES,AX			; バンクセグメント
	MOV	DI,BX			; バンクトップオフセット

	POP	AX

	MOV	DX,AX			; バンク番号コピー元
	CALL	BNKNUM			; バンクアドレスGET

	POP	CX

	PUSH	DS			;
	MOV	DS,AX			; バンクセグメント
	MOV	SI,BX			; バンクトップオフセット
	REP	MOVSB			;
	POP	DS			;

	RET
PATCPY	ENDP



;	パーツPUTエフェクト
;	-I- AX : 0=通常,1=パターンPUTオーバラップ

PATEFC	PROC	NEAR
	MOV	BBOVLP,0	; パターンPUTオーバラップフラグ

	CMP	AX,1		; 1=パターンPUTオーバラップフラグ
	JNE	PATEFC2		;
	MOV	BBOVLP,1	; パターンPUTオーバラップフラグ
PATEFC2:			;
	RET
PATEFC	ENDP



;	バンクアドレスGET
;	-I- DX : バンク番号
;	-O- AX : バンクセグメント
;	    BX : バンクトップオフセット
;	    CX : バンクエンドオフセット
;	    DX : 1=バンク番号該当なし

BNKNUM	PROC	NEAR
	CMP	DX,0			; パーツバッファ#0
	JNE	BNKNUM1			;

	MOV	AX,SEGPAT0		; バンクセグメント
	MOV	BX,TOPPAT0		; バンクトップオフセット
	MOV	CX,ENDPAT0		; バンクエンドオフセット

	JMP	BNKNUM99
BNKNUM1:
	CMP	DX,1			; パーツバッファ#1
	JNE	BNKNUM2			;

	MOV	AX,SEGPAT1		; バンクセグメント
	MOV	BX,TOPPAT1		; バンクトップオフセット
	MOV	CX,ENDPAT1		; バンクエンドオフセット

	JMP	BNKNUM99
BNKNUM2:
	CMP	DX,2			; パーツバッファ#2
	JNE	BNKNUM3			;

	MOV	AX,SEGPAT2		; バンクセグメント
	MOV	BX,TOPPAT2		; バンクトップオフセット
	MOV	CX,ENDPAT2		; バンクエンドオフセット

	JMP	BNKNUM99
BNKNUM3:
	CMP	DX,3			; パーツバッファ#3
	JNE	BNKNUM4			;

	MOV	AX,SEGPAT3		; バンクセグメント
	MOV	BX,TOPPAT3		; バンクトップオフセット
	MOV	CX,ENDPAT3		; バンクエンドオフセット

	JMP	BNKNUM99
BNKNUM4:
	CMP	DX,4			; パーツバッファ#4
	JNE	BNKNUM5			;

	MOV	AX,SEGPAT4		; バンクセグメント
	MOV	BX,TOPPAT4		; バンクトップオフセット
	MOV	CX,ENDPAT4		; バンクエンドオフセット

	JMP	BNKNUM99
BNKNUM5:
	CMP	DX,5			; パーツバッファ#5
	JNE	BNKNUM6			;

	MOV	AX,SEGPAT5		; バンクセグメント
	MOV	BX,TOPPAT5		; バンクトップオフセット
	MOV	CX,ENDPAT5		; バンクエンドオフセット

	JMP	BNKNUM99
BNKNUM6:
	CMP	DX,6			; パーツバッファ#6
	JNE	BNKNUM7			;

	MOV	AX,SEGPAT6		; バンクセグメント
	MOV	BX,TOPPAT6		; バンクトップオフセット
	MOV	CX,ENDPAT6		; バンクエンドオフセット

	JMP	BNKNUM99
BNKNUM7:
;*NON*;	CMP	DX,7			; パーツバッファ#7
;*NON*;	JNE	BNKNUM8			;
;*NON*;
;*NON*;	MOV	AX,SEGPAT7		; バンクセグメント
;*NON*;	MOV	BX,TOPPAT7		; バンクトップオフセット
;*NON*;	MOV	CX,ENDPAT7		; バンクエンドオフセット
;*NON*;
;*NON*;	JMP	BNKNUM99
;*NON*;BNKNUM8:
;*NON*;	CMP	DX,8			; パーツバッファ#8
;*NON*;	JNE	BNKNUM9			;
;*NON*;
;*NON*;	MOV	AX,SEGPAT8		; バンクセグメント
;*NON*;	MOV	BX,TOPPAT8		; バンクトップオフセット
;*NON*;	MOV	CX,ENDPAT8		; バンクエンドオフセット
;*NON*;
;*NON*;	JMP	BNKNUM99
;*NON*;BNKNUM9:
;*NON*;	CMP	DX,9			; パーツバッファ#9
;*NON*;	JNE	BNKNUM10		;
;*NON*;
;*NON*;	MOV	AX,SEGPAT9		; バンクセグメント
;*NON*;	MOV	BX,TOPPAT9		; バンクトップオフセット
;*NON*;	MOV	CX,ENDPAT9		; バンクエンドオフセット
;*NON*;
;*NON*;	JMP	BNKNUM99
;*NON*;BNKNUM10:
;*NON*;	CMP	DX,10			; パーツバッファ#10
;*NON*;	JNE	BNKNUM11		;
;*NON*;
;*NON*;	MOV	AX,SEGPAT10		; バンクセグメント
;*NON*;	MOV	BX,TOPPAT10		; バンクトップオフセット
;*NON*;	MOV	CX,ENDPAT10		; バンクエンドオフセット
;*NON*;
;*NON*;	JMP	BNKNUM99
;*NON*;BNKNUM11:
;*NON*;	CMP	DX,11			; パーツバッファ#11
;*NON*;	JNE	BNKNUM12		;
;*NON*;
;*NON*;	MOV	AX,SEGPAT11		; バンクセグメント
;*NON*;	MOV	BX,TOPPAT11		; バンクトップオフセット
;*NON*;	MOV	CX,ENDPAT11		; バンクエンドオフセット
;*NON*;
;*NON*;	JMP	BNKNUM99
;*NON*;BNKNUM12:
;*NON*;	CMP	DX,12			; パーツバッファ#12
;*NON*;	JNE	BNKNUM13		;
;*NON*;
;*NON*;	MOV	AX,SEGPAT12		; バンクセグメント
;*NON*;	MOV	BX,TOPPAT12		; バンクトップオフセット
;*NON*;	MOV	CX,ENDPAT12		; バンクエンドオフセット
;*NON*;
;*NON*;	JMP	BNKNUM99
;*NON*;
BNKNUM13:
	MOV	AX,0			; バンクセグメント
	MOV	BX,0			; バンクトップオフセット
	MOV	CX,0			; バンクエンドオフセット

	MOV	DX,1			; 1=バンク番号該当なし
	RET

BNKNUM99:
	MOV	DX,0			;
	RET
BNKNUM	ENDP



;	パーツデータの検索
;	-I- CX    : データ番号
;	-O- ES:DI : データ終りポインタ
;	    AX    : 0=normal 1=end of data.
;	    BX    : 検索データ番号

PARTSCH	PROC	NEAR
	PUSH	CX
	MOV	BX,0			; 検索データ番号
	MOV	AX,PRSSEG		; バンクセグメント
	MOV	ES,AX			;
	MOV	DI,PRSTOP		; バンクトップオフセット
	CMP	CX,0			;
	JE	PARTSCH3		;
PARTSCH2:
	;	属性(0=データ終わり,1=無圧縮データ,2=圧縮データ)
	CMP	WORD PTR ES:[DI][PARTS_OFST_ATR],0
	JE	PARTSCH4_NOT			; end of data.
	MOV	DX,ES:[DI][PARTS_OFST_LEN]	; データ長さ
	ADD	DI,DX				;
	ADD	DI,PARTS_OFST_DAT		; データ開始オフセット
	INC	BX			; 検索データ番号
	LOOP	PARTSCH2
PARTSCH3:
	CMP	WORD PTR ES:[DI][PARTS_OFST_ATR],0
	JE	PARTSCH4_NOT			; end of data.
PARTSCH4:
	MOV	AX,0		; 0=normal.
	POP	CX
	RET
PARTSCH4_NOT:
	MOV	AX,1		; 1=not found.
	POP	CX
	RET
PARTSCH	ENDP



;	パーツファイル名セット
;	-I- DS:SI : ファイル名

PAT_FLNSET	PROC	NEAR
	PUSH	SI

	MOV	AX,DS
	MOV	ES,AX

	MOV	DI,OFFSET FLPNAM	; ファイル名クリア
	MOV	CX,8
	MOV	AL,' '
	REP	STOSB

	MOV	DI,OFFSET FLPNAM	; ファイル名
	MOV	CX,8
PAT_FLNSET2:
	LODSB
	CMP	AL,' '			; end of string.
	JB	PAT_FLNSET3		;
	STOSB
	LOOP	PAT_FLNSET2
PAT_FLNSET3:
	POP	SI
	RET
PAT_FLNSET	ENDP


CODE	ENDS



DATA	SEGMENT	PUBLIC	'DATA'

;	パーツバッファ#0

EXTRN	SEGPAT0:WORD		; セグメント
EXTRN	TOPPAT0:WORD		; 先頭オフセット
EXTRN	ENDPAT0:WORD		; 終了オフセット

;	パーツバッファ#1

EXTRN	SEGPAT1:WORD		; セグメント
EXTRN	TOPPAT1:WORD		; 先頭オフセット
EXTRN	ENDPAT1:WORD		; 終了オフセット

;	パーツバッファ#2

EXTRN	SEGPAT2:WORD		; セグメント
EXTRN	TOPPAT2:WORD		; 先頭オフセット
EXTRN	ENDPAT2:WORD		; 終了オフセット

;	パーツバッファ#3

EXTRN	SEGPAT3:WORD		; セグメント
EXTRN	TOPPAT3:WORD		; 先頭オフセット
EXTRN	ENDPAT3:WORD		; 終了オフセット

;	パーツバッファ#4

EXTRN	SEGPAT4:WORD		; セグメント
EXTRN	TOPPAT4:WORD		; 先頭オフセット
EXTRN	ENDPAT4:WORD		; 終了オフセット

;	パーツバッファ#5

EXTRN	SEGPAT5:WORD		; セグメント
EXTRN	TOPPAT5:WORD		; 先頭オフセット
EXTRN	ENDPAT5:WORD		; 終了オフセット

;	パーツバッファ#6

EXTRN	SEGPAT6:WORD		; セグメント
EXTRN	TOPPAT6:WORD		; 先頭オフセット
EXTRN	ENDPAT6:WORD		; 終了オフセット



;*NON*;;	パーツバッファ#7
;*NON*;
;*NON*;EXTRN	SEGPAT7:WORD		; セグメント
;*NON*;EXTRN	TOPPAT7:WORD		; 先頭オフセット
;*NON*;EXTRN	ENDPAT7:WORD		; 終了オフセット
;*NON*;
;*NON*;;	パーツバッファ#8
;*NON*;
;*NON*;EXTRN	SEGPAT8:WORD		; セグメント
;*NON*;EXTRN	TOPPAT8:WORD		; 先頭オフセット
;*NON*;EXTRN	ENDPAT8:WORD		; 終了オフセット
;*NON*;
;*NON*;;	パーツバッファ#9
;*NON*;
;*NON*;EXTRN	SEGPAT9:WORD		; セグメント
;*NON*;EXTRN	TOPPAT9:WORD		; 先頭オフセット
;*NON*;EXTRN	ENDPAT9:WORD		; 終了オフセット
;*NON*;
;*NON*;;	パーツバッファ#10
;*NON*;
;*NON*;EXTRN	SEGPAT10:WORD		; セグメント
;*NON*;EXTRN	TOPPAT10:WORD		; 先頭オフセット
;*NON*;EXTRN	ENDPAT10:WORD		; 終了オフセット
;*NON*;
;*NON*;;	パーツバッファ#11
;*NON*;
;*NON*;EXTRN	SEGPAT11:WORD		; セグメント
;*NON*;EXTRN	TOPPAT11:WORD		; 先頭オフセット
;*NON*;EXTRN	ENDPAT11:WORD		; 終了オフセット
;*NON*;
;*NON*;;	パーツバッファ#12
;*NON*;
;*NON*;EXTRN	SEGPAT12:WORD		; セグメント
;*NON*;EXTRN	TOPPAT12:WORD		; 先頭オフセット
;*NON*;EXTRN	ENDPAT12:WORD		; 終了オフセット
;*NON*;


EXTRN	VRX:WORD		; x point.
EXTRN	VRY:WORD		; y point.

EXTRN	VRLENX:WORD		; x length.
EXTRN	VRLENY:WORD		; y length.

EXTRN	BPOINT:WORD		; data buffer point.
EXTRN	BPNTOF:WORD		; データバッファポインタ
EXTRN	BPNTSG:WORD		; データバッファセグメント
EXTRN	BCNTMX:WORD		; データ最大長さ
EXTRN	BCOUNT:WORD		; データ長さ

EXTRN	BBOVTM:WORD		; パターンPUTオーバラップタイム
EXTRN	BBOVLP:WORD		; パターンPUTオーバラップフラグ


PUBLIC	PRSBNK			; バンク番号
PUBLIC	PRSSEG			; バンクセグメント
PUBLIC	PRSTOP			; バンクトップオフセット
PUBLIC	PRSEND			; バンクエンドオフセット

PUBLIC	PRSOFS			; パーツバッファのカレントポインタ
PUBLIC	PRSSIZ			; パーツバッファの使用サイズ

FLPNAM	DB	"        PT1",0	; ファイル名

		EVEN

PRSOFS		DW	0		; パーツバッファのカレントポインタ
PRSSIZ		DW	0		; パーツバッファの使用サイズ

PRSOPE		DW	0		; PUT時オペレーション
					; 0=normal,1=OR

PRSBNK		DW	0		; バンク番号

PRSSEG		DW	0		; バンクセグメント
PRSTOP		DW	0		; バンクトップオフセット
PRSEND		DW	0		; バンクエンドオフセット

DATA	ENDS

	END
;
;	end of "PARTST.ASM"
;