ReC98/libs/master.lib/egc_shift_right.asm

193 lines
2.9 KiB
NASM

; master library -
;
; Description:
; EGCによる部分右スクロール
;
; Functions/Procedures:
; void egc_shift_right(int x1, int y1, int x2, int y2, int dots);
;
; Parameters:
; x1, y1
; x2, y2
; 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: rshift.asm 0.04 92/05/28 23:00:46 Kazumi Rel $
; 94/ 5/16 Initial: egcsftr.asm/master.lib 0.23
;
func EGC_SHIFT_RIGHT ; egc_shift_right() {
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 DX,[BP+x2]
mov SI,[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:[egcsftr_start_di],AL
mov AX,SI
sub AX,[BP+y1]
mov BX,AX
inc BX ; line count
mov AX,SI
shl SI,2
add SI,AX
shl SI,4 ; y2 * 80
mov AX,DX
shr AX,3
and AX,0fffeh ; LSB = 0
add SI,AX ; start address
shr AX,1
mov BP,CX
shr BP,4
sub AX,BP
inc AX
mov BP,DX
sub BP,CX ; bit length(not inc !!)
mov CX,AX ; 転送 word 数
mov AX,DX
add DX,DI
and DL,0fh
mov DH,15
sub DH,DL ; Dest Bit Address
and AL,0fh
mov AH,15
sub AH,AL ; Src Bit Address
mov AL,AH
xor AH,AH
mov DL,DH
xor DH,DH
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
mov DI,DX
mov AX,41
sub AX,CX
shl AX,1
mov BYTE PTR CS:[egcsftr_sub_si],AL
mov BYTE PTR CS:[egcsftr_sub_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アドレス
or AX,1000h ; Dir = 1
out DX,AX
mov DX,04aeh
mov AX,BP ; ビット長
out DX,AX
std
mov AX,0a800h
mov DS,AX
mov ES,AX
mov DI,SI
inc DI
inc DI
add DI,80 ; dummy
egcsftr_start_di EQU $-1
mov DX,CX
EVEN
@@next_line: mov CX,DX
rep movsw
inc SI
inc SI
inc DI
inc DI
sub SI,80 ; dummy
egcsftr_sub_si EQU $-1
sub DI,80 ; dummy
egcsftr_sub_di EQU $-1
dec BX
jne @@next_line
cld
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 ; }