ReC98/libs/master.lib/super_entry_at.asm

127 lines
2.4 KiB
NASM

; master library - superimpose
;
; Description:
; パターンの登録(最下位)
;
; Function/Procedures:
; int super_entry_at( int num, unsigned patsize, unsigned patseg ) ;
;
; Parameters:
; num 登録先のパターン番号
; patsize パターンの大きさ
; seg パターンデータの格納された, hmemブロックセグメントアドレス
; (このアドレスがそのまま登録される。中身はパターンサイズに
; 従って mask->B->R->G->Iの順に入っていること, または
; TINY形式も可)
;
; Returns:
; InsufficientMemory (cy=1) super_bufferが確保できない(9216bytes)
; GeneralFailure (cy=1) numが 512以上
; NoError (cy=0) 成功
;
; Binding Target:
; Microsoft-C / Turbo-C / Turbo Pascal
;
; Running Target:
;
;
; Requiring Resources:
; CPU: V30
;
; Notes:
; すでに登録されている場所に登録すると、以前のデータは開放されます。
;
; Assembly Language Note:
; AX,flagレジスタを破壊します。
; d flagは必ず 0 になります。
;
; Compiler/Assembler:
; TASM 3.0
; OPTASM 1.6
;
; Author:
; 恋塚昭彦
;
; Revision History:
; 93/12/ 7 Initial: superat.asm/master.lib 0.22
; 95/ 2/14 [M0.22k] mem_AllocID対応
BUFFER_SIZE equ (16+2)*128*4
func SUPER_ENTRY_AT ; super_entry_at() {
push BP
mov BP,SP
push BX
CLD
num = (RETSIZE+3)*2
patsize = (RETSIZE+2)*2
patseg = (RETSIZE+1)*2
mov BX,[BP+num]
cmp BX,MAXPAT
cmc
mov AX,GeneralFailure
jc short EXIT
; super_bufferをチェック
cmp super_buffer,0
jne short DO_ENTRY
; 完全に開放された状態(初期値)だった場合
mov mem_AllocID,MEMID_super
push BUFFER_SIZE/16
_call HMEM_ALLOC ; 確保する
mov super_buffer,AX
mov AX,InsufficientMemory
jc short EXIT
push ES
push CX
push DI
push DS
pop ES
xor AX,AX
mov DI,offset super_patsize ; パターンサイズ配列を初期化
mov CX,MAXPAT
rep stosw
pop DI
pop CX
pop ES
DO_ENTRY:
mov AX,BX
shl BX,1
cmp AX,super_patnum
jae short ADDING ; 最後尾以降なら…
OVERWRITING: ; 登録最後尾より前なら上書き
cmp super_patsize[BX],0
je short GO
push super_patdata[BX] ; すでに何かあるなら開放
_call HMEM_FREE
jmp short GO
ADDING:
inc AX
mov super_patnum,AX
GO:
mov AX,[BP+patsize]
mov super_patsize[BX],AX
mov AX,[BP+patseg]
mov super_patdata[BX],AX
xor AX,AX ; clc, NoError
EXIT:
pop BX
pop BP
ret 6
EVEN
endfunc ; }