ReC98/libs/master.lib/super_entry_pat.asm

203 lines
3.3 KiB
NASM

; superimpose & master library module
;
; Description:
; パターンの登録
;
; Functions/Procedures:
; int super_entry_pat( int patsize, void far *image_addr, int clear_color ) ;
;
; Parameters:
; patsize
; image_addr パターンの先頭アドレス
; clear_color 透明色
;
; Returns:
; InsufficientMemory (cy=1) メモリが足りない
; GeneralFailure (cy=1) 登録数が多すぎる
; 0〜 (cy=0) 成功。登録したパターン番号
;
; Binding Target:
; Microsoft-C / Turbo-C / Turbo Pascal
;
; Running Target:
; PC-9801
;
; Requiring Resources:
; CPU: V30
;
; Notes:
; Heapからメモリをパターンを保持するために取得します。
;
; Compiler/Assembler:
; TASM 3.0
; OPTASM 1.6
;
; Author:
; Kazumi(奥田 仁)
; 恋塚(恋塚昭彦)
;
; Revision History:
;
;$Id: superpat.asm 0.09 93/02/19 20:11:35 Kazumi Rel $
;
; 93/ 3/20 Initial: master.lib <- super.lib 0.22b
; 93/12/ 6 [M0.22] BUGFIX パターンを全部削除したあとだと
; super_bufferを再確保していた
; 95/ 2/14 [M0.22k] mem_AllocID対応
; 95/ 3/14 [M0.22k] BUGFIX 失敗時、GeneralFailure等が返っていなかった
; 95/ 3/16 [M0.22k] BUGFIX 失敗時、メモリを開放していなかった
MRETURN macro
pop DI
pop SI
pop BP
ret 8
EVEN
endm
retfunc ENTRY_AT_ERROR ; エラー in: ES = pattern segment
push AX
push ES
call HMEM_FREE
pop AX
jmp short ERROR_EXIT
endfunc
retfunc SUPERPAT_NO_MEMORY ; メモリ不足
mov AX,InsufficientMemory
ERROR_EXIT label near ; エラー終了 in: AX = error code
stc
MRETURN
endfunc
func SUPER_ENTRY_PAT ; super_entry_pat() {
push BP
mov BP,SP
push SI
push DI
patsize = (RETSIZE+4)*2
image_addr = (RETSIZE+2)*2
clear_color = (RETSIZE+1)*2
mov DI,super_patnum
shl DI,1 ;integer size
mov AX,[BP+patsize]
mov DX,AX
mul AH
mov BX,AX ; BX = plane size
shl AX,2
add AX,BX
mov mem_AllocID,MEMID_super
push AX
_call HMEM_ALLOCBYTE ; allocate (plane size * 5) bytes
jc short SUPERPAT_NO_MEMORY
mov ES,AX ; ES = パターン領域
push super_patnum ; 登録番号
push DX ; patsize
push AX ; パターン領域
_call SUPER_ENTRY_AT ; BX,ESは破壊されないこと
jc short ENTRY_AT_ERROR
push DS
; パターンデータを確保パターン領域に転送する
lds SI,[BP+image_addr]
mov DI,BX
mov CX,BX
shl CX,1 ;4plane / word
rep movsw
push ES
pop DS ; DS もパターン領域に
; マスクプレーンを生成する
mov SI,BX ; plane size (パターン先頭)
mov DX,[BP+clear_color]
mov DH,DL
mov CX,BX
xor DI,DI
shr DH,1
jc short BLUE_REV
rep movsb
jmp short RED
EVEN
BLUE_REV:
lodsb
not AL
stosb
loop short BLUE_REV
EVEN
RED:
; red
mov CX,BX
xor DI,DI
shr DH,1
sbb AH,AH
EVEN
OR_RED:
lodsb
xor AL,AH
or [DI],AL
inc DI
loop short OR_RED
; green
mov CX,BX
xor DI,DI
shr DH,1
sbb AH,AH
EVEN
OR_GREEN:
lodsb
xor AL,AH
or [DI],AL
inc DI
loop short OR_GREEN
; inten
mov CX,BX
xor DI,DI
shr DH,1
sbb AH,AH
EVEN
OR_INTEN:
lodsb
xor AL,AH
or [DI],AL
inc DI
loop short OR_INTEN
; パターン内の透明部分をマスクで繰り抜く
test DL,DL ; 透明色が 0 なら省略
jz short @@return
mov AH,4
EVEN
CLEAR:
xor SI,SI
mov CX,BX
EVEN
CLEAR_PLANE:
lodsb
and [DI],AL
inc DI
loop short CLEAR_PLANE
dec AH
jnz short CLEAR
EVEN
; 終わり
@@return:
pop DS
mov AX,super_patnum
dec AX
MRETURN
endfunc ; }