[Reduction] #242: egc_shift_left

This commit is contained in:
nmlgc 2014-08-28 04:45:41 +02:00
parent 23b7c04376
commit b67d68409e
4 changed files with 189 additions and 415 deletions

View File

@ -0,0 +1,182 @@
; 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 ; }

View File

@ -87,170 +87,7 @@ sub_73A endp
include libs/master.lib/dos_setvect.asm
include libs/master.lib/egc.asm
include libs/master.lib/egc_shift_down.asm
; =============== S U B R O U T I N E =======================================
; Attributes: bp-based frame
sub_8FA proc far
arg_0 = word ptr 6
arg_2 = word ptr 8
arg_4 = word ptr 0Ah
arg_6 = word ptr 0Ch
arg_8 = word ptr 0Eh
push bp
mov bp, sp
push ds
push si
push di
mov cx, [bp+arg_8]
mov si, [bp+arg_6]
mov dx, [bp+arg_4]
mov bx, [bp+arg_2]
mov di, [bp+arg_0]
mov ax, di
dec ax
shr ax, 4
shl ax, 1
mov byte ptr cs:loc_9CB+2, al
sub bx, si
inc bx
mov ax, si
shl si, 2
add si, ax
shl si, 4
mov ax, cx
shr ax, 3
and ax, 0FFFEh
add si, ax
shr ax, 1
mov bp, dx
shr bp, 4
sub bp, ax
inc bp
mov ax, bp
mov bp, dx
sub bp, cx
mov es, cx
assume es:nothing
mov cx, ax
mov dx, es
sub dx, di
and dx, 0Fh
mov ax, es
and ax, 0Fh
push bx
push bp
mov bx, bp
add bx, ax
shr bx, 4
add bp, dx
shr bp, 4
cmp al, dl
jz short loc_972
jl short loc_96C
cmp bx, bp
jnz short loc_972
jmp short loc_970
; ---------------------------------------------------------------------------
loc_96C:
cmp bx, bp
jge short loc_972
loc_970:
inc cx
nop
loc_972:
pop bp
pop bx
shl dl, 4
or dl, al
xor dh, dh
mov di, dx
mov ax, 29h ; ')'
sub ax, cx
shl ax, 1
mov byte ptr cs:loc_9D8+2, al
mov byte ptr cs:loc_9DB+2, al
mov al, 7
out 6Ah, al ; PC-98 GDC (6a):
;
mov al, 80h ; '€'
out 7Ch, al
mov al, 5
out 6Ah, al ; PC-98 GDC (6a):
;
mov dx, 4A0h
mov ax, 0FFF0h
out dx, ax
mov dx, 4A2h
mov ax, 0FFh
out dx, ax
mov dx, 4A4h
mov ax, 28F0h
out dx, ax
mov dx, 4A8h
mov ax, 0FFFFh
out dx, ax
mov dx, 4ACh
mov ax, di
out dx, ax
mov dx, 4AEh
mov ax, bp
out dx, ax
mov ax, 0A800h
mov ds, ax
assume ds:nothing
mov es, ax
assume es:nothing
mov di, si
dec di
dec di
loc_9CB:
sub di, 50h ; 'P'
mov dx, cx
loc_9D0:
mov cx, dx
rep movsw
dec si
dec si
dec di
dec di
loc_9D8:
add si, 50h ; 'P'
loc_9DB:
add di, 50h ; 'P'
dec bx
jnz short loc_9D0
mov dx, 4A0h
mov ax, 0FFF0h
out dx, ax
mov al, 4
out 6Ah, al ; PC-98 GDC (6a):
;
mov al, 0
out 7Ch, al
mov al, 6
out 6Ah, al ; PC-98 GDC (6a):
;
pop di
pop si
pop ds
assume ds:dseg
pop bp
retf 0Ah
sub_8FA endp
; ---------------------------------------------------------------------------
nop
include libs/master.lib/egc_shift_left.asm
; =============== S U B R O U T I N E =======================================
@ -14785,7 +14622,7 @@ loc_9B1B:
lea ax, [si+13Fh]
push ax
push large 12B0004h
call sub_8FA
call egc_shift_left
push large 0C00000h
call grcg_setcolor
lea ax, [si+138h]

View File

@ -91,129 +91,7 @@ include libs/master.lib/dos_seek.asm
include libs/master.lib/dos_setvect.asm
include libs/master.lib/egc.asm
include libs/master.lib/egc_shift_down.asm
loc_A22:
push bp
mov bp, sp
push ds
push si
push di
mov cx, [bp+0Eh]
mov si, [bp+0Ch]
mov dx, [bp+0Ah]
mov bx, [bp+8]
mov di, [bp+6]
mov ax, di
dec ax
shr ax, 4
shl ax, 1
mov cs:byte_AF5, al
sub bx, si
inc bx
mov ax, si
shl si, 2
add si, ax
shl si, 4
mov ax, cx
shr ax, 3
and ax, 0FFFEh
add si, ax
shr ax, 1
mov bp, dx
shr bp, 4
sub bp, ax
inc bp
mov ax, bp
mov bp, dx
sub bp, cx
mov es, cx
assume es:nothing
mov cx, ax
mov dx, es
sub dx, di
and dx, 0Fh
mov ax, es
and ax, 0Fh
push bx
push bp
mov bx, bp
add bx, ax
shr bx, 4
add bp, dx
shr bp, 4
cmp al, dl
jz short loc_A9A
jl short loc_A94
cmp bx, bp
jnz short loc_A9A
jmp short loc_A98
; ---------------------------------------------------------------------------
loc_A94:
cmp bx, bp
jge short loc_A9A
loc_A98:
inc cx
nop
loc_A9A:
pop bp
pop bx
shl dl, 4
or dl, al
xor dh, dh
mov di, dx
mov ax, 29h ; ')'
sub ax, cx
shl ax, 1
mov cs:byte_B02, al
mov cs:byte_B05, al
mov al, 7
out 6Ah, al ; PC-98 GDC (6a):
;
mov al, 80h ; '€'
out 7Ch, al
mov al, 5
out 6Ah, al ; PC-98 GDC (6a):
;
mov dx, 4A0h
mov ax, 0FFF0h
out dx, ax
mov dx, 4A2h
mov ax, 0FFh
out dx, ax
mov dx, 4A4h
mov ax, 28F0h
out dx, ax
mov dx, 4A8h
mov ax, 0FFFFh
out dx, ax
mov dx, 4ACh
mov ax, di
out dx, ax
mov dx, 4AEh
mov ax, bp
out dx, ax
mov ax, 0A800h
mov ds, ax
mov es, ax
assume es:nothing
mov di, si
dec di
dec di
; ---------------------------------------------------------------------------
db 83h, 0EFh
byte_AF5 db 50h
db 8Bh, 0D1h, 8Bh, 0CAh, 0F3h, 0A5h, 2 dup(4Eh), 2 dup(4Fh)
db 83h, 0C6h
byte_B02 db 50h
db 83h, 0C7h
byte_B05 db 50h
db 4Bh, 75h, 0EFh, 0BAh, 0A0h, 4, 0B8h, 0F0h, 0FFh, 0EFh
db 0B0h, 4, 0E6h, 6Ah, 0B0h, 0, 0E6h, 7Ch, 0B0h, 6, 0E6h
db 6Ah, 5Fh, 5Eh, 1Fh, 5Dh, 0CAh, 0Ah, 0, 90h
; ---------------------------------------------------------------------------
include libs/master.lib/egc_shift_left.asm
loc_B24:
push bp
@ -20996,7 +20874,7 @@ loc_CD68:
mov ax, word_255BE
neg ax
push ax
call far ptr loc_A22
call egc_shift_left
jmp short loc_CDA4
; ---------------------------------------------------------------------------

View File

@ -48,130 +48,7 @@ include libs/master.lib/dos_seek.asm
include libs/master.lib/dos_setvect.asm
include libs/master.lib/egc.asm
include libs/master.lib/egc_shift_down.asm
loc_9B0:
; sub_10287+62P
push bp
mov bp, sp
push ds
push si
push di
mov cx, [bp+0Eh]
mov si, [bp+0Ch]
mov dx, [bp+0Ah]
mov bx, [bp+8]
mov di, [bp+6]
mov ax, di
dec ax
shr ax, 4
shl ax, 1
mov cs:byte_A83, al
sub bx, si
inc bx
mov ax, si
shl si, 2
add si, ax
shl si, 4
mov ax, cx
shr ax, 3
and ax, 0FFFEh
add si, ax
shr ax, 1
mov bp, dx
shr bp, 4
sub bp, ax
inc bp
mov ax, bp
mov bp, dx
sub bp, cx
mov es, cx
assume es:nothing
mov cx, ax
mov dx, es
sub dx, di
and dx, 0Fh
mov ax, es
and ax, 0Fh
push bx
push bp
mov bx, bp
add bx, ax
shr bx, 4
add bp, dx
shr bp, 4
cmp al, dl
jz short loc_A28
jl short loc_A22
cmp bx, bp
jnz short loc_A28
jmp short loc_A26
; ---------------------------------------------------------------------------
loc_A22:
cmp bx, bp
jge short loc_A28
loc_A26:
inc cx
nop
loc_A28:
pop bp
pop bx
shl dl, 4
or dl, al
xor dh, dh
mov di, dx
mov ax, 29h ; ')'
sub ax, cx
shl ax, 1
mov cs:byte_A90, al
mov cs:byte_A93, al
mov al, 7
out 6Ah, al ; PC-98 GDC (6a):
;
mov al, 80h ; '€'
out 7Ch, al
mov al, 5
out 6Ah, al ; PC-98 GDC (6a):
;
mov dx, 4A0h
mov ax, 0FFF0h
out dx, ax
mov dx, 4A2h
mov ax, 0FFh
out dx, ax
mov dx, 4A4h
mov ax, 28F0h
out dx, ax
mov dx, 4A8h
mov ax, 0FFFFh
out dx, ax
mov dx, 4ACh
mov ax, di
out dx, ax
mov dx, 4AEh
mov ax, bp
out dx, ax
mov ax, 0A800h
mov ds, ax
mov es, ax
assume es:nothing
mov di, si
dec di
dec di
; ---------------------------------------------------------------------------
db 83h, 0EFh
byte_A83 db 50h
db 8Bh, 0D1h, 8Bh, 0CAh, 0F3h, 0A5h, 2 dup(4Eh), 2 dup(4Fh)
db 83h, 0C6h
byte_A90 db 50h
db 83h, 0C7h
byte_A93 db 50h
db 4Bh, 75h, 0EFh, 0BAh, 0A0h, 4, 0B8h, 0F0h, 0FFh, 0EFh
db 0B0h, 4, 0E6h, 6Ah, 0B0h, 0, 0E6h, 7Ch, 0B0h, 6, 0E6h
db 6Ah, 5Fh, 5Eh, 1Fh, 5Dh, 0CAh, 0Ah, 0, 90h
; ---------------------------------------------------------------------------
include libs/master.lib/egc_shift_left.asm
loc_AB2:
push bp
@ -27961,13 +27838,13 @@ loc_102B9:
mov ax, word_2CE02
neg ax
push ax
call far ptr loc_9B0
call egc_shift_left
push large 200000h
push large 19F018Fh
mov ax, word_2CE02
neg ax
push ax
call far ptr loc_9B0
call egc_shift_left
jmp short loc_1030C
; ---------------------------------------------------------------------------