; 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 ; }