[Reduction] #244: egc_shift_up

This commit is contained in:
nmlgc 2014-08-28 05:04:37 +02:00
parent cc2d874c26
commit 9e5b986403
3 changed files with 184 additions and 240 deletions

View File

@ -0,0 +1,180 @@
; master library -
;
; Description:
; EGCによる部分上スクロール
;
; Functions/Procedures:
; void egc_shift_up(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: ushift.asm 0.02 92/05/28 23:01:16 Kazumi Rel $
; 94/ 5/16 Initial: egcsftu.asm/master.lib 0.23
;
func EGC_SHIFT_UP ; egc_shift_up() {
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
shl AX,2
add AX,DI
shl AX,4
mov WORD PTR CS:[egcsftu_diff],AX
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 AX,ES
and AX,000fh ; Src Bit Address
mov DX,AX ; Dest 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:[egcsftu_add_si],AL
mov BYTE PTR CS:[egcsftu_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
sub DI,1111h ; dummy
egcsftu_diff EQU $-2
mov DX,CX
EVEN
@@next_line: mov CX,DX
rep movsw
dec SI
dec SI
dec DI
dec DI
add SI,80 ; dummy
egcsftu_add_si EQU $-1
add DI,80 ; dummy
egcsftu_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

@ -93,125 +93,7 @@ include libs/master.lib/egc.asm
include libs/master.lib/egc_shift_down.asm
include libs/master.lib/egc_shift_left.asm
include libs/master.lib/egc_shift_right.asm
loc_C34:
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
shl ax, 2
add ax, di
shl ax, 4
mov cs:word_D03, ax
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 ax, es
and ax, 0Fh
mov dx, ax
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_CAA
jl short loc_CA4
cmp bx, bp
jnz short loc_CAA
jmp short loc_CA8
; ---------------------------------------------------------------------------
nop
loc_CA4:
cmp bx, bp
jge short loc_CAA
loc_CA8:
inc cx
nop
loc_CAA:
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_D12, al
mov cs:byte_D15, 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
; ---------------------------------------------------------------------------
db 81h, 0EFh
word_D03 dw 1111h
db 8Bh, 0D1h, 90h, 8Bh, 0CAh, 0F3h, 0A5h, 2 dup(4Eh), 2 dup(4Fh)
db 83h, 0C6h
byte_D12 db 50h
db 83h, 0C7h
byte_D15 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_up.asm
; =============== S U B R O U T I N E =======================================
@ -20769,7 +20651,7 @@ loc_CDA9:
mov ax, word_255C0
neg ax
push ax
call far ptr loc_C34
call egc_shift_up
jmp short loc_CDE5
; ---------------------------------------------------------------------------

View File

@ -50,125 +50,7 @@ include libs/master.lib/egc.asm
include libs/master.lib/egc_shift_down.asm
include libs/master.lib/egc_shift_left.asm
include libs/master.lib/egc_shift_right.asm
loc_BC2:
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
shl ax, 2
add ax, di
shl ax, 4
mov cs:word_C91, ax
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 ax, es
and ax, 0Fh
mov dx, ax
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_C38
jl short loc_C32
cmp bx, bp
jnz short loc_C38
jmp short loc_C36
; ---------------------------------------------------------------------------
nop
loc_C32:
cmp bx, bp
jge short loc_C38
loc_C36:
inc cx
nop
loc_C38:
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_CA0, al
mov cs:byte_CA3, 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
; ---------------------------------------------------------------------------
db 81h, 0EFh
word_C91 dw 1111h
db 8Bh, 0D1h, 90h, 8Bh, 0CAh, 0F3h, 0A5h, 2 dup(4Eh), 2 dup(4Fh)
db 83h, 0C6h
byte_CA0 db 50h
db 83h, 0C7h
byte_CA3 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_up.asm
; =============== S U B R O U T I N E =======================================
@ -27749,7 +27631,7 @@ loc_10339:
mov ax, word_2CE04
neg ax
push ax
call far ptr loc_BC2
call egc_shift_up
jmp short loc_10377
; ---------------------------------------------------------------------------