ReC98/libs/master.lib/egc_shift_left.asm

183 lines
2.8 KiB
NASM

; master library -
;
; Description:
; EGCによる部分左スクロール
;
; Functions/Procedures:
; void egc_shift_left(int x1, int y1, int x2, int y2, int dots);
;
; Parameters:
; dots
;
; Returns:
; none
;
; Binding Target:
; Microsoft-C / Turbo-C / Turbo Pascal
;
; Running Target:
; PC-9801VX
;
; Requiring Resources:
; CPU: 186
; EGC
;
; Notes:
;
;
; Assembly Language Note:
;
;
; Compiler/Assembler:
; TASM 3.0
; OPTASM 1.6
;
; Author:
; Kazumi
;
; Revision History:
;$Id: lshift.asm 0.04 92/05/28 22:55:10 Kazumi Rel $
; 94/ 5/16 Initial: egcsftl.asm/master.lib 0.23
;
func EGC_SHIFT_LEFT ; egc_shift_left() {
push BP
mov BP,SP
push DS
push SI
push DI
x1 = (RETSIZE+5)*2
y1 = (RETSIZE+4)*2
x2 = (RETSIZE+3)*2
y2 = (RETSIZE+2)*2
dots = (RETSIZE+1)*2
mov CX,[BP+x1]
mov SI,[BP+y1]
mov DX,[BP+x2]
mov BX,[BP+y2]
mov DI,[BP+dots]
mov AX,DI
dec AX ; 94/05/13 dots が 16 の倍数のとき
shr AX,4
shl AX,1
mov BYTE PTR CS:[egcsftl_start_di],AL
sub BX,SI
inc BX ; line count
mov AX,SI
shl SI,2
add SI,AX
shl SI,4 ; y1 * 80
mov AX,CX
shr AX,3
and AX,0fffeh ; LSB = 0
add SI,AX ; start address
shr AX,1
mov BP,DX
shr BP,4
sub BP,AX
inc BP
mov AX,BP
mov BP,DX
sub BP,CX ; bit length(not inc !!)
mov ES,CX
mov CX,AX ; 転送 word 数
mov DX,ES
sub DX,DI
and DX,000fh ; Dest Bit Address
mov AX,ES
and AX,000fh ; Src Bit Address
push BX
push BP
mov BX,BP
add BX,AX
shr BX,4
add BP,DX
shr BP,4
cmp AL,DL
je short @@none
jl short @@less
cmp BX,BP
jne short @@none
jmp SHORT @@plus
EVEN
@@less: cmp BX,BP
jge short @@none
EVEN
@@plus: inc CX
EVEN
@@none: pop BP
pop BX
shl DL,4
or DL,AL
xor DH,DH
mov DI,DX
mov AX,41
sub AX,CX
shl AX,1
mov BYTE PTR CS:[egcsftl_add_si],AL
mov BYTE PTR CS:[egcsftl_add_di],AL
mov AL,00000111b ; RegWriteEnable
out 6ah,AL
mov AL,80h ; CGmode = 1
out 7ch,AL
mov AL,05h ; ExBit = 1
out 6ah,AL
mov DX,04a0h
mov AX,0fff0h ; アクティブプレーン
out DX,AX
mov DX,04a2h
mov AX,00ffh ; FGC/BGC/リードプレーン
out DX,AX
mov DX,04a4h
mov AX,28f0h ; モードレジスタ/ROPコードレジスタ
out DX,AX
mov DX,04a8h
mov AX,0ffffh ; マスクレジスタ
out DX,AX
mov DX,04ach
mov AX,DI ; Dir/Bitアドレス
out DX,AX
mov DX,04aeh
mov AX,BP ; ビット長
out DX,AX
mov AX,0a800h
mov DS,AX
mov ES,AX
mov DI,SI
dec DI
dec DI
sub DI,80 ; dummy
egcsftl_start_di EQU $-1
mov DX,CX
EVEN
@@next_line: mov CX,DX
rep movsw
dec SI
dec SI
dec DI
dec DI
add SI,80 ; dummy
egcsftl_add_si EQU $-1
add DI,80 ; dummy
egcsftl_add_di EQU $-1
dec BX
jne @@next_line
mov DX,04a0h
mov AX,0fff0h
out DX,AX
mov AL,04h ; ExBit = 0
out 6ah,AL
mov AL,00h ; GRCG stop
out 7ch,AL
mov AL,00000110b ; RegWriteDIsable
out 6ah,AL
pop DI
pop SI
pop DS
pop BP
ret 5*2
endfunc ; }