mirror of https://github.com/nmlgc/ReC98.git
183 lines
2.8 KiB
NASM
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 ; }
|