ReC98/libs/master.lib/text_boxfilla.asm

96 lines
1.6 KiB
NASM

; master library - PC98
;
; Description:
; テキスト画面の長方形範囲を指定属性で埋める
;
; Function/Procedures:
; void text_boxfilla( unsigned x1, unsigned y1, unsigned x2, unsigned y2,
; unsigned atrb ) ;
;
; Parameters:
; unsigned x1 左端の横座標( 0 〜 79 )
; unsigned y1 上端の縦座標( 0 〜 24 )
; unsigned x2 右端の横座標( 0 〜 79 )
; unsigned y2 下端の縦座標( 0 〜 24 )
; unsigned atrb 属性
;
; Returns:
; none
;
; Binding Target:
; Microsoft-C / Turbo-C / Turbo Pascal
;
; Running Target:
; PC-9801
;
; Requiring Resources:
; CPU: 8086
;
; Notes:
; x1 <= x2 かつ y1 <= y2でなければならない。
;
; Compiler/Assembler:
; TASM 3.0
; OPTASM 1.6
;
; Author:
; 恋塚昭彦
;
; Revision History:
; 92/11/15 Initial
func TEXT_BOXFILLA
push DI
pushf
CLI
add SP,(2+retsize)*2
; パラメータ領域の先頭( flags,DI,retadr )
pop AX ; color
pop DX ; y2
pop BX ; x2
pop CX ; Y1
mov DI,CX
shl DI,1
shl DI,1
add DI,CX
shl DI,1
add DI,TextVramSeg
add DI,200h
mov ES,DI ; これで ESに (0,y1)のテキスト属性セグメントが入った
pop DI ; X1
sub SP,(5+2+retsize)*2
; (5(パラメータの数)+1(リターンアドレス)+2(DI,flags))*2
popf
sub BX,DI ; BX = X2 - X1 + 1
inc BX ;
sub DX,CX
mov CX,DX
shl DX,1
shl DX,1
add DX,CX
shl DX,1
shl DX,1
shl DX,1
shl DX,1
add DI,DX
shl DI,1 ; これで DI には(x1,y2)のoffsetが入った。
lea DX,[BX+80]
shl DX,1 ; 毎回の減少分
EVEN
@@SLOOP: mov CX,BX
rep stosw ; 一行分の書き込み
sub DI,DX ; 下の行に移動
jnb short @@SLOOP
pop DI
ret 10
endfunc