Diff for /np2/i286x/Attic/egcmem.x86 between versions 1.5 and 1.6

version 1.5, 2004/02/18 02:03:36 version 1.6, 2005/02/08 09:18:59
Line 1 Line 1
 ; egc - asm version  
 ;  
 ; asm version: egcasm.asm + egc.c  
   
 %include 'x86/np2asm.inc'  #error  move: /mem/x86/memegc.x86
   
 section .bss  
   
         extern  _mem  
         extern  _grcg  
         extern  _gdcs  
         extern  _egc  
         extern  _vramupdate  
         global  _egc_src  
         global  _egc_data  
         global  _egc_dst  
         global  _egc_pat  
   
         global  _egcshift  
   
         global  @egc_read@4  
         global  @egc_write@8  
         global  @egc_read_w@4  
         global  @egc_write_w@8  
   
         global  egc_read  
         global  egc_write  
         global  egc_read_w  
         global  egc_write_w  
   
   
         _egc_src        resd    2  
         _egc_data       resd    2  
         _egc_dst        resd    2  
         _egc_pat        resd    2  
   
 VIDEOMEMORY             equ             _mem  
   
 section .data  
   
 egcmask_ua      db      0ffh, 07fh, 03fh, 01fh, 00fh, 007h, 003h, 001h  
                         db      0feh, 07eh, 03eh, 01eh, 00eh, 006h, 002h, 000h  
                         db      0fch, 07ch, 03ch, 01ch, 00ch, 004h, 000h, 000h  
                         db      0f8h, 078h, 038h, 018h, 008h, 000h, 000h, 000h  
                         db      0f0h, 070h, 030h, 010h, 000h, 000h, 000h, 000h  
                         db      0e0h, 060h, 020h, 000h, 000h, 000h, 000h, 000h  
                         db      0c0h, 040h, 000h, 000h, 000h, 000h, 000h, 000h  
                         db      080h, 000h, 000h, 000h, 000h, 000h, 000h, 000h  
 egcmask_ub      db      080h, 0c0h, 0e0h, 0f0h, 0f8h, 0fch, 0feh, 0ffh  
   
 egcmask_da      db      0ffh, 0feh, 0fch, 0f8h, 0f0h, 0e0h, 0c0h, 080h  
                         db      07fh, 07eh, 07ch, 078h, 070h, 060h, 040h, 000h  
                         db      03fh, 03eh, 03ch, 038h, 030h, 020h, 000h, 000h  
                         db      01fh, 01eh, 01ch, 018h, 010h, 000h, 000h, 000h  
                         db      00fh, 00eh, 00ch, 008h, 000h, 000h, 000h, 000h  
                         db      007h, 006h, 004h, 000h, 000h, 000h, 000h, 000h  
                         db      003h, 002h, 000h, 000h, 000h, 000h, 000h, 000h  
                         db      001h, 000h, 000h, 000h, 000h, 000h, 000h, 000h  
 egcmask_db      db      001h, 003h, 007h, 00fh, 01fh, 03fh, 07fh, 0ffh  
   
 vramoffset      dd      VRAM_B, VRAM_R, VRAM_G, VRAM_E  
   
   
 section .text  
   
                                 align   16  
 _egcshift:              mov             eax, [_egc + egc_t.leng]  
                                 and             eax, 0fffh  
                                 inc             eax  
                                 mov             [_egc + egc_t.remain], eax  
                                 mov             eax, [_egc + egc_t.sft]  
                                 mov             edx, _egc + egc_t.buf  
                                 test    ah, 10h  
                                 je              egsft_dircalced  
                                 add             edx, 512 + 3  
 egsft_dircalced:mov             [_egc + egc_t.inptr], edx  
                                 mov             [_egc + egc_t.outptr], edx  
                                 and             dword [_egc + egc_t.stack], byte 0  
                                 and             edx, byte 1  
                                 mov             ah, al                                                          ; al = srcbit  
                                 shr             ah, 4                                                           ; ah = dstbit  
                                 and             ax, 0f0fh  
                                 mov             [_egc + egc_t.srcbit], al  
                                 mov             [_egc + egc_t.dstbit], ah  
                                 and             ax, 0707h  
                                 sub             al, ah                                                  ; al = srcbit - dstbit  
                                 je              short egsft_funcrst                             ; srcbit == dstbit  
                                 jc              short egsft_difm  
                                 add             edx, byte 4                                             ; srcbit > dstbit  
                                 jmp             short egsft_difcal  
 egsft_difm:             add             edx, byte 2                                             ; srcbit < dstbit  
                                 add             al, 8  
 egsft_difcal:   mov             [_egc + egc_t.sft8bitl], al  
                                 dec             al                                                              ; +-- al = 8 - al  
                                 xor             al, 7                                                   ; +  
                                 mov             [_egc + egc_t.sft8bitr], al  
 egsft_funcrst:  mov             [_egc + egc_t.func], edx  
                                 ret  
   
   
   
                                 align   4  
 egcsftb_upn_sub:  
                                 movzx   eax, byte [_egc + egc_t.dstbit]  
                                 cmp             eax, byte 8  
                                 jae             short estb_upns_of  
                                 test    eax, eax  
                                 jne             short estb_upns_db  
   
                                 sub             dword [_egc + egc_t.remain], byte 8  
                                 jnc             short estb_upns_cal  
                                 xor             edx, edx  
                                 xchg    edx, [_egc + egc_t.remain]  
                                 add             edx, byte (8 - 1)  
                                 mov             al, byte [egcmask_ub + edx]  
                                 jmp             short estb_upns_msk  
   
 estb_upns_of:   and             byte [_egc + egc_t.dstbit], 7  
                                 mov             byte [_egc + egc_t.srcmask + ebx], 0  
                                 ret  
   
 estb_upns_db:   mov             byte [_egc + egc_t.dstbit], 0  
                                 mov             edx, 8  
                                 sub             edx, eax  
                                 sub             [_egc + egc_t.remain], edx  
                                 jc              short estb_upns_dbof  
                                 mov             al, [egcmask_ua + eax]  
                                 jmp             short estb_upns_msk  
 estb_upns_dbof:  
                                 xor             edx, edx  
                                 xchg    edx, [_egc + egc_t.remain]  
                                 neg             edx                                                     ; edx = mask start  
                                 mov             al, [egcmask_ua + eax + edx*8]  
 estb_upns_msk:  
                                 mov             [_egc + egc_t.srcmask + ebx], al  
   
 estb_upns_cal:  mov             edx, [_egc + egc_t.outptr]  
                                 mov             al, [edx + 0]  
                                 mov             [_egc_src + ebx + 0], al  
                                 mov             al, [edx + 4]  
                                 mov             [_egc_src + ebx + 2], al  
                                 mov             al, [edx + 8]  
                                 mov             [_egc_src + ebx + 4], al  
                                 mov             al, [edx + 12]  
                                 mov             [_egc_src + ebx + 6], al  
                                 inc             dword [_egc + egc_t.outptr]  
                                 ret  
   
   
 ; ****---4 -------8 --------  
 ; **---4-- -----8-- ------  
 ; out -> ax <<< (src - dst) -> al  
   
                                 align   4  
 egcsftb_upl_sub:  
                                 movzx   eax, byte [_egc + egc_t.dstbit]  
                                 cmp             al, 8  
                                 jae             short estb_upls_of  
   
                                 test    al, al  
                                 jne             short estb_upls_db  
                                 sub             dword [_egc + egc_t.remain], 8  
                                 jnc             short estb_upls_cal  
   
                                 xor             edx, edx  
                                 xchg    edx, [_egc + egc_t.remain]  
                                 add             edx, 8 - 1  
                                 mov             al, [egcmask_ub + edx]  
                                 jmp             short estb_upls_msk  
   
 estb_upls_of:   and             byte [_egc + egc_t.dstbit], 7  
                                 mov             byte [_egc + egc_t.srcmask + ebx], 0  
                                 ret  
   
 estb_upls_db:  
                                 mov             byte [_egc + egc_t.dstbit], 0  
                                 mov             edx, 8  
                                 sub             edx, eax  
                                 sub             [_egc + egc_t.remain], edx  
                                 jc              short estb_upls_dbof  
                                 mov             al, [egcmask_ua + eax]  
                                 jmp             short estb_upls_msk  
 estb_upls_dbof:  
                                 xor             edx, edx  
                                 xchg    edx, [_egc + egc_t.remain]  
                                 neg             edx                                                     ; edx = mask start  
                                 mov             al, [egcmask_ua + eax + edx*8]  
   
 estb_upls_msk:  
                                 mov             [_egc + egc_t.srcmask + ebx], al  
 estb_upls_cal:  
                                 mov             edx, [_egc + egc_t.outptr]  
                                 mov             cl, [_egc + egc_t.sft8bitl]  
                                 mov             ax, [edx + 0]  
                                 rol             ax, cl  
                                 mov             [_egc_src + ebx + 0], al  
                                 mov             ax, [edx + 4]  
                                 rol             ax, cl  
                                 mov             [_egc_src + ebx + 2], al  
                                 mov             ax, [edx + 8]  
                                 rol             ax, cl  
                                 mov             [_egc_src + ebx + 4], al  
                                 mov             ax, [edx + 12]  
                                 rol             ax, cl  
                                 mov             [_egc_src + ebx + 6], al  
                                 inc             dword [_egc + egc_t.outptr]  
                                 ret  
   
   
 ; ****---4 -------8 --------  
 ; ******-- -4------ --8----- --  
 ; out -> ax >>> (dst - src) -> ah  
   
                                 align   4  
 egcsftb_upr_sub:  
                                 movzx   eax, byte [_egc + egc_t.dstbit]  
                                 cmp             al, 8  
                                 jae             short estb_uprs_of  
   
                                 test    al, al  
                                 jne             short estb_uprs_db  
   
                                 inc             dword [_egc + egc_t.outptr]  
                                 sub             dword [_egc + egc_t.remain], 8  
                                 jnc             short estb_uprs_cal  
   
                                 xchg    eax, [_egc + egc_t.remain]  
                                 add             eax, 8 - 1  
                                 mov             al, [egcmask_ub + eax]  
                                 jmp             short estb_uprs_msk  
   
 estb_uprs_of:   and             byte [_egc + egc_t.dstbit], 7  
                                 mov             byte [_egc + egc_t.srcmask + ebx], 0  
                                 ret  
 estb_uprs_db:  
                                 mov             byte [_egc + egc_t.dstbit], 0  
                                 mov             edx, 8  
                                 sub             edx, eax  
                                 sub             [_egc + egc_t.remain], edx  
                                 jc              short estb_uprs_dbof  
                                 mov             al, [egcmask_ua + eax]  
                                 jmp             short estb_uprs_msk  
 estb_uprs_dbof:  
                                 xor             edx, edx  
                                 xchg    edx, [_egc + egc_t.remain]  
                                 neg             edx                                                     ; edx = mask start  
                                 mov             al, [egcmask_ua + eax + edx*8]  
 estb_uprs_msk:  
                                 mov             [_egc + egc_t.srcmask + ebx], al  
 estb_uprs_cal:  
                                 mov             edx, [_egc + egc_t.outptr]  
                                 mov             cl, [_egc + egc_t.sft8bitr]  
                                 mov             ax, [edx - 1]  
                                 ror             ax, cl  
                                 mov             [_egc_src + ebx + 0], ah  
                                 mov             ax, [edx + 3]  
                                 ror             ax, cl  
                                 mov             [_egc_src + ebx + 2], ah  
                                 mov             ax, [edx + 7]  
                                 ror             ax, cl  
                                 mov             [_egc_src + ebx + 4], ah  
                                 mov             ax, [edx + 11]  
                                 ror             ax, cl  
                                 mov             [_egc_src + ebx + 6], ah  
                                 ret  
   
   
   
                                 align   4  
 egcsftb_dnn_sub:  
                                 movzx   eax, byte [_egc + egc_t.dstbit]  
                                 cmp             al, 8  
                                 jae             short estb_dnns_of  
   
                                 test    al, al  
                                 jne             short estb_dnns_db  
                                 sub             dword [_egc + egc_t.remain], 8  
                                 jnc             short estb_dnns_cal  
   
                                 xor             edx, edx  
                                 xchg    edx, [_egc + egc_t.remain]  
                                 add             edx, 8 - 1  
                                 mov             al, [egcmask_db + edx]  
                                 jmp             short estb_dnns_msk  
   
 estb_dnns_of:   and             byte [_egc + egc_t.dstbit], 7  
                                 mov             byte [_egc + egc_t.srcmask + ebx], 0  
                                 ret  
   
 estb_dnns_db:  
                                 mov             byte [_egc + egc_t.dstbit], 0  
                                 mov             edx, 8  
                                 sub             edx, eax  
                                 sub             [_egc + egc_t.remain], edx  
                                 jc              short estb_dnns_dbof  
                                 mov             al, [egcmask_da + eax]  
                                 jmp             short estb_dnns_msk  
 estb_dnns_dbof:  
                                 xor             edx, edx  
                                 xchg    edx, [_egc + egc_t.remain]  
                                 neg             edx                                                     ; edx = mask start  
                                 mov             al, [egcmask_da + eax + edx*8]  
   
 estb_dnns_msk:  
                                 mov             [_egc + egc_t.srcmask + ebx], al  
 estb_dnns_cal:  
                                 mov             edx, [_egc + egc_t.outptr]  
                                 mov             al, [edx + 0]  
                                 mov             [_egc_src + ebx + 0], al  
                                 mov             al, [edx + 4]  
                                 mov             [_egc_src + ebx + 2], al  
                                 mov             al, [edx + 8]  
                                 mov             [_egc_src + ebx + 4], al  
                                 mov             al, [edx + 12]  
                                 mov             [_egc_src + ebx + 6], al  
                                 dec             dword [_egc + egc_t.outptr]  
                                 ret  
   
   
 ;                       al     ah  
 ;          -------- 8------- 3--*****  
 ;             ----- ---8---- ---3--**  
 ; out -> ax >>> (dst - src) -> ah  
   
                                 align   4  
 egcsftb_dnl_sub:  
                                 movzx   eax, byte [_egc + egc_t.dstbit]  
                                 cmp             al, 8  
                                 jae             short estb_dnls_of  
   
                                 test    al, al  
                                 jne             short estb_dnls_db  
                                 sub             dword [_egc + egc_t.remain], 8  
                                 jnc             short estb_dnls_cal  
   
                                 xor             edx, edx  
                                 xchg    edx, [_egc + egc_t.remain]  
                                 add             edx, 8 - 1  
                                 mov             al, [egcmask_db + edx]  
                                 jmp             short estb_dnls_msk  
   
 estb_dnls_of:   and             byte [_egc + egc_t.dstbit], 7  
                                 mov             byte [_egc + egc_t.srcmask + ebx], 0  
                                 ret  
   
 estb_dnls_db:  
                                 mov             byte [_egc + egc_t.dstbit], 0  
                                 mov             edx, 8  
                                 sub             edx, eax  
                                 sub             [_egc + egc_t.remain], edx  
                                 jc              short estb_dnls_dbof  
                                 mov             al, [egcmask_da + eax]  
                                 jmp             short estb_dnls_msk  
 estb_dnls_dbof:  
                                 xor             edx, edx  
                                 xchg    edx, [_egc + egc_t.remain]  
                                 neg             edx                                                     ; edx = mask start  
                                 mov             al, [egcmask_da + eax + edx*8]  
   
 estb_dnls_msk:  
                                 mov             [_egc + egc_t.srcmask + ebx], al  
 estb_dnls_cal:  
                                 dec             dword [_egc + egc_t.outptr]  
                                 mov             edx, [_egc + egc_t.outptr]  
                                 mov             cl, [_egc + egc_t.sft8bitl]  
                                 mov             ax, [edx + 0]  
                                 ror             ax, cl  
                                 mov             [_egc_src + ebx + 0], ah  
                                 mov             ax, [edx + 4]  
                                 ror             ax, cl  
                                 mov             [_egc_src + ebx + 2], ah  
                                 mov             ax, [edx + 8]  
                                 ror             ax, cl  
                                 mov             [_egc_src + ebx + 4], ah  
                                 mov             ax, [edx + 12]  
                                 ror             ax, cl  
                                 mov             [_egc_src + ebx + 6], ah  
                                 ret  
   
   
 ;          -------- 8------- 6-----**  
 ;      --- -----8-- -----6-- ---*****  
 ; out -> ax <<< (dst - src) -> al  
   
                                 align   4  
 egcsftb_dnr_sub:  
                                 movzx   eax, byte [_egc + egc_t.dstbit]  
                                 cmp             al, 8  
                                 jae             short estb_dnrs_of  
   
                                 test    al, al  
                                 jne             short estb_dnrs_db  
                                 dec             dword [_egc + egc_t.outptr]  
                                 sub             dword [_egc + egc_t.remain], 8  
                                 jnc             short estb_dnrs_cal  
   
                                 xor             edx, edx  
                                 xchg    edx, [_egc + egc_t.remain]  
                                 add             edx, 8 - 1  
                                 mov             al, [egcmask_db + edx]  
                                 jmp             short estb_dnrs_msk  
   
 estb_dnrs_of:   and             byte [_egc + egc_t.dstbit], 7  
                                 mov             byte [_egc + egc_t.srcmask + ebx], 0  
                                 ret  
   
 estb_dnrs_db:  
                                 mov             byte [_egc + egc_t.dstbit], 0  
                                 mov             edx, 8  
                                 sub             edx, eax  
                                 sub             [_egc + egc_t.remain], edx  
                                 jc              short estb_dnrs_dbof  
                                 mov             al, [egcmask_da + eax]  
                                 jmp             short estb_dnrs_msk  
 estb_dnrs_dbof:  
                                 xor             edx, edx  
                                 xchg    edx, [_egc + egc_t.remain]  
                                 neg             edx                                                     ; edx = mask start  
                                 mov             al, [egcmask_da + eax + edx*8]  
   
 estb_dnrs_msk:  
                                 mov             [_egc + egc_t.srcmask + ebx], al  
 estb_dnrs_cal:  
                                 mov             edx, [_egc + egc_t.outptr]  
                                 mov             cl, [_egc + egc_t.sft8bitr]  
                                 mov             ax, [edx + 0]  
                                 rol             ax, cl  
                                 mov             [_egc_src + ebx + 0], al  
                                 mov             ax, [edx + 4]  
                                 rol             ax, cl  
                                 mov             [_egc_src + ebx + 2], al  
                                 mov             ax, [edx + 8]  
                                 rol             ax, cl  
                                 mov             [_egc_src + ebx + 4], al  
                                 mov             ax, [edx + 12]  
                                 rol             ax, cl  
                                 mov             [_egc_src + ebx + 6], al  
                                 ret  
   
   
 ; -------------------------------------------------------------------------  
   
 %macro  egcsft_byte             1  
                                 mov             byte [_egc + egc_t.srcmask + ebx], 0ffh  
                                 mov             eax, 8  
                                 sub             al, [_egc + egc_t.dstbit]  
                                 jc              short %%dstbitover0  
                                 sub             [_egc + egc_t.stack], eax  
                                 jc              %%dstbitover1  
                                 call    %1  
                                 cmp             dword [_egc + egc_t.remain], 0  
                                 je              near _egcshift  
                                 ret  
 %%dstbitover0:  sub             byte [_egc + egc_t.dstbit], 8  
                                 mov             word [_egc + egc_t.srcmask], 0  
                                 ret  
 %%dstbitover1:  add             [_egc + egc_t.stack], eax               ; Ìᤷ¤Æ¡Ä  
                                 mov             word [_egc + egc_t.srcmask], 0  
                                 ret  
 %endmacro  
   
   
 %macro  egcsft_word_up  1  
                                 ; ebx == 0  
                                 mov             word [_egc + egc_t.srcmask], 0ffffh  
                                 lea             eax, [ebx + 16]  
                                 sub             al, byte [_egc + egc_t.dstbit]  
                                 cmp             [_egc + egc_t.stack], eax  
                                 jc              short %%dstbitover  
                                 sub             [_egc + egc_t.stack], eax  
                                 call    %1  
                                 cmp             dword [_egc + egc_t.remain], ebx  
                                 je              short %%uplhlf  
                                 inc             ebx  
                                 call    %1  
                                 dec             ebx  
                                 cmp             [_egc + egc_t.remain], ebx  
                                 je              near _egcshift  
                                 ret  
 %%dstbitover:   mov             word [_egc + egc_t.srcmask], bx  
                                 ret  
 %%uplhlf:               mov             byte [_egc + egc_t.srcmask + 1], bl  
                                 jmp             _egcshift  
 %endmacro  
   
   
 %macro  egcsft_word_dn  1  
                                 ; ebx == 0  
                                 mov             word [_egc + egc_t.srcmask], 0ffffh  
                                 lea             eax, [ebx + 16]  
                                 sub             al, [_egc + egc_t.dstbit]  
                                 cmp             [_egc + egc_t.stack], eax  
                                 jc              short %%dstbitover  
                                 sub             [_egc + egc_t.stack], eax  
                                 inc             ebx  
                                 call    %1  
                                 dec             ebx  
                                 cmp             [_egc + egc_t.remain], ebx  
                                 je              short %%uplhlf  
                                 call    %1  
                                 cmp             [_egc + egc_t.remain], ebx  
                                 je              near _egcshift  
                                 ret  
   
                                 align   4  
 %%dstbitover:   mov             word [_egc + egc_t.srcmask], bx  
                                 ret  
   
                                 align   4  
 %%uplhlf:               mov             byte [_egc + egc_t.srcmask], bl  
                                 jmp             _egcshift  
 %endmacro  
   
   
   
                                 align   4  
 egcsftb_upn0:   egcsft_byte             egcsftb_upn_sub  
                                 align   4  
 egcsftb_upl0:   egcsft_byte             egcsftb_upl_sub  
                                 align   4  
 egcsftb_upr0:   egcsft_byte             egcsftb_upr_sub  
   
                                 align   4  
 egcsftb_dnn0:   egcsft_byte             egcsftb_dnn_sub  
                                 align   4  
 egcsftb_dnl0:   egcsft_byte             egcsftb_dnl_sub  
                                 align   4  
 egcsftb_dnr0:   egcsft_byte             egcsftb_dnr_sub  
   
   
                                 align   4  
 egcsftw_upn0:   egcsft_word_up  egcsftb_upn_sub  
                                 align   4  
 egcsftw_upl0:   egcsft_word_up  egcsftb_upl_sub  
                                 align   4  
 egcsftw_upr0:   egcsft_word_up  egcsftb_upr_sub  
   
                                 align   4  
 egcsftw_dnn0:   egcsft_word_dn  egcsftb_dnn_sub  
                                 align   4  
 egcsftw_dnl0:   egcsft_word_dn  egcsftb_dnl_sub  
                                 align   4  
 egcsftw_dnr0:   egcsft_word_dn  egcsftb_dnr_sub  
   
   
 section .rdata  
   
 egcsft_proc             dd              egcsftw_upn0,   egcsftw_dnn0  
                                 dd              egcsftw_upr0,   egcsftw_dnr0  
                                 dd              egcsftw_upl0,   egcsftw_dnl0  
                                 dd              egcsftb_upn0,   egcsftb_dnn0  
                                 dd              egcsftb_upr0,   egcsftb_dnr0  
                                 dd              egcsftb_upl0,   egcsftb_dnl0  
   
 section .text  
   
   
                         ; ebx:ext dx:data esi:func  
 egcope_shift:   mov             ecx, [_egc + egc_t.inptr]  
                                 xor             eax, eax  
                                 test    byte [_egc + egc_t.sft + 1], 10h  
                                 setz    al  
                                 cmp             esi, byte 6  
                                 jae             short eosft_byte  
                                 lea             ecx, [ecx + eax - 1]  
                                 mov             [ecx + 0], dx  
                                 mov             [ecx + 4], dx  
                                 mov             [ecx + 8], dx  
                                 mov             [ecx +12], dx  
                                 lea             eax, [eax*2 - 1]  
   
 shiftinput_w:   cmp             dword [_egc + egc_t.stack], byte 16  
                                 ja              short eosw_callsub  
                                 add             [_egc + egc_t.inptr], eax  
                                 cmp             byte [_egc + egc_t.srcbit], 0  
                                 je              short eosw_stkadd  
                                 xor             edx, edx  
                                 xchg    dl, [_egc + egc_t.srcbit]  
                                 cmp             dl, 8  
                                 jc              short eosw_stksub  
                                 add             [_egc + egc_t.outptr], eax  
 eosw_stksub:    sub             [_egc + egc_t.stack], edx  
 eosw_stkadd:    add             dword [_egc + egc_t.stack], byte 16  
                                 add             [_egc + egc_t.inptr], eax  
 eosw_callsub:   jmp             dword [egcsft_proc + esi*4]  
                                 align   4  
 eosft_byte:             mov             [ecx + 0], dl  
                                 mov             [ecx + 4], dl  
                                 mov             [ecx + 8], dl  
                                 mov             [ecx +12], dl  
                                 lea             eax, [eax*2 - 1]  
   
 shiftinput_b:   cmp             dword [_egc + egc_t.stack], byte 16  
                                 ja              short eosb_callsub  
                                 add             [_egc + egc_t.inptr], eax  
                                 cmp             byte [_egc + egc_t.srcbit], 0  
                                 je              short eosb_stkadd  
                                 btr             word [_egc + egc_t.srcbit], 3  
                                 jc              short eosb_callsub  
                                 xor             edx, edx  
                                 xchg    dl, [_egc + egc_t.srcbit]  
                                 sub             [_egc + egc_t.stack], edx  
 eosb_stkadd:    add             [_egc + egc_t.stack], byte 8  
 eosb_callsub:   jmp             dword [egcsft_proc + esi*4]  
   
   
   
                         ; ebx:ext ebp:addr dx:data esi:func  
 egc_mod:                mov             ax, [_egc + egc_t.mask]  
                                 mov             [_egc + egc_t.mask2], ax  
                                 mov             al, [_egc + egc_t.ope + 1]  
                                 mov             ah, al  
                                 and             al, 18h  
                                 jpe             short eow_setdat  
                                 cmp             al, 10h  
                                 je              short eow_setpat  
   
 eow_setsrc:             test    ah, 4  
                                 je              short eow_srcnf  
                                 call    egcope_shift  
 eow_srcnf:              mov             ax, [_egc + egc_t.srcmask]  
                                 and             [_egc + egc_t.mask2], ax  
                                 call    egc_opesub  
                                 mov             ecx, _egc_data  
                                 mov             [ecx + 0], esi  
                                 mov             [ecx + 4], edi  
                                 ret  
   
 eow_setpat:             mov             al, [_egc + egc_t.fgbg + 1]  
                                 and             al, 60h  
                                 jpe             short eow_setpatsft  
                                 mov             edx, _egc + egc_t.bgc  
                                 cmp             al, 40h  
                                 jne             short eow_store  
                                 mov             edx, _egc + egc_t.fgc  
                                 jmp             short eow_store  
   
 eow_setpatsft:  test    ah, 4  
                                 je              short eow_patnf  
                                 call    egcope_shift  
 eow_patnf:              mov             ax, [_egc + egc_t.srcmask]  
                                 and             [_egc + egc_t.mask2], ax  
                                 mov             edx, _egc_src  
 eow_store:              mov             esi, [edx + 0]  
                                 mov             edi, [edx + 4]  
                                 mov             ecx, _egc_data  
                                 mov             [ecx + 0], esi  
                                 mov             [ecx + 4], edi  
                                 ret  
   
 eow_setdat:             mov             ecx, _egc_data  
                                 mov             [ecx + 0], dx  
                                 mov             [ecx + 2], dx  
                                 mov             [ecx + 4], dx  
                                 mov             [ecx + 6], dx  
                                 ret  
   
   
   
   
   
   
                                 ; !!! ¤¢¤È¤Ç¥¹¥¿¥Ã¥¯¤ò»ÈÍѤ¹¤ë¤³¤È  
                                 ; make pattern...  
 egc_opesub:             mov             al, [_egc + egc_t.fgbg + 1]  
                                 and             al, 60h  
                                 jpe             short eo_opesrc  
                                 mov             edx, _egc + egc_t.bgc  
                                 cmp             al, 20h  
                                 je              short eo_loadvram  
                                 mov             edx, _egc + egc_t.fgc  
                                 jmp             short eo_loadvram  
   
 eo_opesrc:              mov             al, [_egc + egc_t.ope + 1]  
                                 and             al, 3  
                                 cmp             al, 1  
                                 mov             edx, _egc_src  
                                 je              short eo_loadvram  
                                 mov             edx, _egc + egc_t.patreg  
   
 eo_loadvram:    mov             ax, [VIDEOMEMORY + ebp + VRAM_R]  
                                 shl             eax, 16  
                                 mov             ax, [VIDEOMEMORY + ebp + VRAM_B]  
                                 mov             [_egc_dst + 0], eax  
                                 mov             ax, [VIDEOMEMORY + ebp + VRAM_E]  
                                 shl             eax, 16  
                                 mov             ax, [VIDEOMEMORY + ebp + VRAM_G]  
                                 mov             [_egc_dst + 4], eax  
   
                                 xor             esi, esi  
                                 xor             edi, edi  
                                 mov             cl, byte [_egc + egc_t.ope]  
   
                                 ; pat = [edx]   src = _egc_src  dst = _egc_dst  
 egc_ope80:              add             cl, cl  
                                 jnc             short egc_ope40  
                                 mov             eax, [edx + 0]  
                                 and             eax, [_egc_src + 0]  
                                 and             eax, [_egc_dst + 0]  
                                 or              esi, eax  
                                 mov             eax, [edx + 4]  
                                 and             eax, [_egc_src + 4]  
                                 and             eax, [_egc_dst + 4]  
                                 or              edi, eax  
   
 egc_ope40:              add             cl, cl  
                                 jnc             short egc_ope20  
                                 mov             eax, [edx + 0]  
                                 not             eax  
                                 and             eax, [_egc_src + 0]  
                                 and             eax, [_egc_dst + 0]  
                                 or              esi, eax  
                                 mov             eax, [edx + 4]  
                                 not             eax  
                                 and             eax, [_egc_src + 4]  
                                 and             eax, [_egc_dst + 4]  
                                 or              edi, eax  
   
 egc_ope20:              add             cl, cl  
                                 jnc             short egc_ope10  
                                 mov             eax, [_egc_dst + 0]  
                                 not             eax  
                                 and             eax, [edx + 0]  
                                 and             eax, [_egc_src + 0]  
                                 or              esi, eax  
                                 mov             eax, [_egc_dst + 4]  
                                 not             eax  
                                 and             eax, [edx + 4]  
                                 and             eax, [_egc_src + 4]  
                                 or              edi, eax  
   
 egc_ope10:              add             cl, cl  
                                 jnc             short egc_ope08  
                                 mov             eax, [edx + 0]  
                                 or              eax, [_egc_dst + 0]  
                                 not             eax  
                                 and             eax, [_egc_src + 0]  
                                 or              esi, eax  
                                 mov             eax, [edx + 4]  
                                 or              eax, [_egc_dst + 4]  
                                 not             eax  
                                 and             eax, [_egc_src + 4]  
                                 or              edi, eax  
   
 egc_ope08:              add             cl, cl  
                                 jnc             short egc_ope04  
                                 mov             eax, [_egc_src + 0]  
                                 not             eax  
                                 and             eax, [edx + 0]  
                                 and             eax, [_egc_dst + 0]  
                                 or              esi, eax  
                                 mov             eax, [_egc_src + 4]  
                                 not             eax  
                                 and             eax, [edx + 4]  
                                 and             eax, [_egc_dst + 4]  
                                 or              edi, eax  
   
 egc_ope04:              add             cl, cl  
                                 jnc             short egc_ope02  
                                 mov             eax, [edx + 0]  
                                 or              eax, [_egc_src + 0]  
                                 not             eax  
                                 and             eax, [_egc_dst + 0]  
                                 or              esi, eax  
                                 mov             eax, [edx + 4]  
                                 or              eax, [_egc_src + 4]  
                                 not             eax  
                                 and             eax, [_egc_dst + 4]  
                                 or              edi, eax  
   
 egc_ope02:              add             cl, cl  
                                 jnc             short egc_ope01  
                                 mov             eax, [_egc_src + 0]  
                                 or              eax, [_egc_dst + 0]  
                                 not             eax  
                                 and             eax, [edx + 0]  
                                 or              esi, eax  
                                 mov             eax, [_egc_src + 4]  
                                 or              eax, [_egc_dst + 4]  
                                 not             eax  
                                 and             eax, [edx + 4]  
                                 or              edi, eax  
   
 egc_ope01:              add             cl, cl  
                                 jnc             short egc_ope00  
                                 mov             eax, [edx + 0]  
                                 or              eax, [_egc_src + 0]  
                                 or              eax, [_egc_dst + 0]  
                                 not             eax  
                                 or              esi, eax  
                                 mov             eax, [edx + 4]  
                                 or              eax, [_egc_src + 4]  
                                 or              eax, [_egc_dst + 4]  
                                 not             eax  
                                 or              edi, eax  
   
 egc_ope00:              ret  
   
   
   
 ; ---- byte access  
   
                                 align   16  
 @egc_read@4:  
 egc_read:               pushad  
                                 mov             ebx, ecx  
                                 and             ebx, byte 1  
                                 cmp             byte [_gdcs + gdcs_t.access], 0  
                                 je              short egcr_getvram  
                                 add             ecx, VRAM_STEP  
 egcr_getvram:   mov             ebp, ecx  
                                 and             ecx, (VRAM_STEP + 7fffh)  
                                 mov             al, [VIDEOMEMORY + ecx + VRAM_B]  
                                 mov             ah, [VIDEOMEMORY + ecx + VRAM_R]  
                                 mov             dl, [VIDEOMEMORY + ecx + VRAM_G]  
                                 mov             dh, [VIDEOMEMORY + ecx + VRAM_E]  
                                 mov             [_egc + egc_t.lastvram + ebx + 0], al  
                                 mov             [_egc + egc_t.lastvram + ebx + 2], ah  
                                 mov             [_egc + egc_t.lastvram + ebx + 4], dl  
                                 mov             [_egc + egc_t.lastvram + ebx + 6], dh  
   
 egcr_setpat:    mov             cl, [_egc + egc_t.ope + 1]  
                                 and             cl, 3  
                                 cmp             cl, 1  
                                 jne             short egcr_setsrc  
                                 mov             [_egc + egc_t.patreg + ebx + 0], al  
                                 mov             [_egc + egc_t.patreg + ebx + 2], ah  
                                 mov             [_egc + egc_t.patreg + ebx + 4], dl  
                                 mov             [_egc + egc_t.patreg + ebx + 6], dh  
   
 egcr_setsrc:    test    byte [_egc + egc_t.ope + 1], 4  
                                 je              short egcr_shift  
   
                                 test    byte [_egc + egc_t.ope + 1], 20h  
                                 jne             short egcr_raw  
                                 movzx   ecx, byte [_egc + egc_t.fgbg + 1]  
                                 and             ecx, 3  
                                 and             ebp, (VRAM_STEP + 7fffh)  
                                 add             ebp, [vramoffset + ecx*4]  
                                 jmp             short egcr_raw  
   
 egcr_shift:             mov             esi, [_egc + egc_t.inptr]  
                                 mov             [esi + 0], al  
                                 mov             [esi + 4], ah  
                                 mov             [esi + 8], dl  
                                 mov             [esi +12], dh  
                                 xor             eax, eax  
                                 test    byte [_egc + egc_t.sft + 1], 10h  
                                 setz    al  
                                 lea             eax, [eax*2 - 1]  
                                 mov             esi, [_egc + egc_t.func]  
                                 add             esi, byte 6  
                                 call    shiftinput_b                                    ;; !!  
                                 test    byte [_egc + egc_t.ope + 1], 20h  
                                 jne             short egcr_raw  
                                 movzx   ecx, byte [_egc + egc_t.fgbg + 1]  
                                 and             ecx, 3  
                                 mov             al, [_egc_src + ecx*2 + ebx]  
                                 mov             [esp + 28], al  
                                 popad  
                                 ret  
   
 egcr_raw:               mov             al, [VIDEOMEMORY + ebp]  
                                 mov             [esp + 28], al  
                                 popad  
                                 ret  
   
   
                                 align   16  
 @egc_write@8:  
 egc_write:              pushad  
                                 mov             dh, dl  
 egc_write_m:    mov             ebx, ecx  
                                 and             ebx, byte 1  
                                 and             ecx, 7fffh  
                                 mov             ebp, ecx  
                                 cmp             byte [_gdcs + gdcs_t.access], 0  
                                 jne             short egcw_pln1  
                                 or              byte [_gdcs + gdcs_t.grphdisp], 1  
                                 or              byte [_vramupdate + ecx], 01h  
                                 jmp             short egcw_setpat  
 egcw_pln1:              or              byte [_gdcs + gdcs_t.grphdisp], 2  
                                 or              byte [_vramupdate + ecx], 02h  
                                 add             ebp, VRAM_STEP  
 egcw_setpat:    mov             al, [_egc + egc_t.ope + 1]  
                                 and             al, 3  
                                 cmp             al, 2  
                                 jne             short egcw_calc  
                                 mov             al, [VIDEOMEMORY + ebp + VRAM_B]  
                                 mov             [_egc + egc_t.patreg + ebx + 0], al  
                                 mov             al, [VIDEOMEMORY + ebp + VRAM_R]  
                                 mov             [_egc + egc_t.patreg + ebx + 2], al  
                                 mov             al, [VIDEOMEMORY + ebp + VRAM_G]  
                                 mov             [_egc + egc_t.patreg + ebx + 4], al  
                                 mov             al, [VIDEOMEMORY + ebp + VRAM_E]  
                                 mov             [_egc + egc_t.patreg + ebx + 6], al  
 egcw_calc:              mov             esi, [_egc + egc_t.func]  
                                 add             esi, byte 6  
                                 sub             ebp, ebx  
                                 call    egc_mod  
                                 mov             ah, [_egc + egc_t.mask2 + ebx]  
                                 test    ah, ah  
                                 je              short egcw_ed  
                                 mov             dh, ah  
                                 not             dh  
                                 add             ecx, ebx  
                                 add             ebp, ebx  
                                 mov             dl, [_egc + egc_t.access]  
 egcw_wb:                shr             dl, 1  
                                 jc              short egcw_wr  
                                 and             [VIDEOMEMORY + ebp + VRAM_B], dh  
                                 mov             al, [ecx]  
                                 and             al, ah  
                                 or              [VIDEOMEMORY + ebp + VRAM_B], al  
 egcw_wr:                shr             dl, 1  
                                 jc              short egcw_wg  
                                 and             [VIDEOMEMORY + ebp + VRAM_R], dh  
                                 mov             al, [ecx + 2]  
                                 and             al, ah  
                                 or              [VIDEOMEMORY + ebp + VRAM_R], al  
 egcw_wg:                shr             dl, 1  
                                 jc              short egcw_we  
                                 and             [VIDEOMEMORY + ebp + VRAM_G], dh  
                                 mov             al, [ecx + 4]  
                                 and             al, ah  
                                 or              [VIDEOMEMORY + ebp + VRAM_G], al  
 egcw_we:                shr             dl, 1  
                                 jc              short egcw_ed  
                                 and             [VIDEOMEMORY + ebp + VRAM_E], dh  
                                 mov             al, [ecx + 6]  
                                 and             al, ah  
                                 or              [VIDEOMEMORY + ebp + VRAM_E], al  
 egcw_ed:                popad  
                                 ret  
   
   
 ; ---- word access  
   
                                 align   16  
 @egc_read_w@4:  
 egc_read_w:             test    cl, 1  
                                 jne             near egcrw_odd  
                                 pushad  
                                 cmp             byte [_gdcs + gdcs_t.access], 0  
                                 je              short egcrw_getvram  
                                 add             ecx, VRAM_STEP  
 egcrw_getvram:  mov             ebp, ecx  
                                 and             ecx, (VRAM_STEP + 7fffh)  
                                 mov             bx, [VIDEOMEMORY + ecx + VRAM_B]  
                                 mov             dx, [VIDEOMEMORY + ecx + VRAM_R]  
                                 mov             si, [VIDEOMEMORY + ecx + VRAM_G]  
                                 mov             di, [VIDEOMEMORY + ecx + VRAM_E]  
                                 mov             [_egc + egc_t.lastvram + 0], bx  
                                 mov             [_egc + egc_t.lastvram + 2], dx  
                                 mov             [_egc + egc_t.lastvram + 4], si  
                                 mov             [_egc + egc_t.lastvram + 6], di  
   
 egcrw_setpat:   mov             cl, [_egc + egc_t.ope + 1]  
                                 and             cl, 3  
                                 cmp             cl, 1  
                                 jne             short egcrw_setsrc  
                                 mov             [_egc + egc_t.patreg + 0], bx  
                                 mov             [_egc + egc_t.patreg + 2], dx  
                                 mov             [_egc + egc_t.patreg + 4], si  
                                 mov             [_egc + egc_t.patreg + 6], di  
   
 egcrw_setsrc:   test    byte [_egc + egc_t.ope + 1], 4  
                                 je              short egcrw_shift  
   
                                 test    byte [_egc + egc_t.ope + 1], 20h  
                                 jne             short egcrw_raw  
                                 movzx   ecx, byte [_egc + egc_t.fgbg + 1]  
                                 and             ecx, 3  
                                 and             ebp, (VRAM_STEP + 7fffh)  
                                 add             ebp, [vramoffset + ecx*4]  
                                 jmp             short egcrw_raw  
   
 egcrw_shift:    mov             ecx, [_egc + egc_t.inptr]  
                                 xor             eax, eax  
                                 test    byte [_egc + egc_t.sft + 1], 10h  
                                 setz    al  
                                 lea             ecx, [ecx + eax - 1]  
                                 mov             [ecx + 0], bx  
                                 mov             [ecx + 4], dx  
                                 mov             [ecx + 8], si  
                                 mov             [ecx +12], di  
                                 lea             eax, [eax*2 - 1]  
                                 xor             ebx, ebx  
                                 mov             esi, [_egc + egc_t.func]  
                                 call    shiftinput_w                                    ;; !!  
   
                                 test    byte [_egc + egc_t.ope + 1], 20h  
                                 jne             short egcrw_raw  
                                 movzx   ecx, byte [_egc + egc_t.fgbg + 1]  
                                 and             ecx, 3  
                                 mov             ax, [_egc_src + ecx*2]  
                                 mov             [esp + 28], ax  
                                 popad  
                                 ret  
   
 egcrw_raw:              mov             ax, [VIDEOMEMORY + ebp]  
                                 mov             [esp + 28], ax  
                                 popad  
                                 ret  
   
                                 align   4  
 egcrw_odd:              test    byte [_egc + egc_t.sft + 1], 10h  
                                 jne             short egcrw_oddr  
                                 call    egc_read  
                                 mov             ah, al  
                                 inc             ecx  
                                 call    egc_read  
                                 dec             ecx  
                                 xchg    al, ah  
                                 ret  
 egcrw_oddr:             inc             ecx  
                                 call    egc_read  
                                 dec             ecx  
                                 mov             ah, al  
                                 jmp             egc_read  
   
   
                                 align   16  
 @egc_write_w@8:  
 egc_write_w:    test    cl, 1  
                                 jne             near egcww_odd  
                                 pushad  
                                 xor             ebx, ebx  
                                 and             ecx, 7fffh  
                                 mov             ebp, ecx  
                                 cmp             byte [_gdcs + gdcs_t.access], 0  
                                 jne             short egcww_pln1  
                                 or              byte [_gdcs + gdcs_t.grphdisp], 1  
                                 or              word [_vramupdate + ecx], 0101h  
                                 jmp             short egcww_setpat  
 egcww_pln1:             or              byte [_gdcs + gdcs_t.grphdisp], 2  
                                 or              word [_vramupdate + ecx], 0202h  
                                 add             ebp, VRAM_STEP  
 egcww_setpat:   mov             al, [_egc + egc_t.ope + 1]  
                                 and             al, 3  
                                 cmp             al, 2  
                                 jne             short egcww_calc  
                                 mov             ax, [VIDEOMEMORY + ebp + VRAM_B]  
                                 mov             [_egc + egc_t.patreg + 0], ax  
                                 mov             ax, [VIDEOMEMORY + ebp + VRAM_R]  
                                 mov             [_egc + egc_t.patreg + 2], ax  
                                 mov             ax, [VIDEOMEMORY + ebp + VRAM_G]  
                                 mov             [_egc + egc_t.patreg + 4], ax  
                                 mov             ax, [VIDEOMEMORY + ebp + VRAM_E]  
                                 mov             [_egc + egc_t.patreg + 6], ax  
 egcww_calc              mov             esi, [_egc + egc_t.func]  
                                 call    egc_mod  
                                 mov             si, [_egc + egc_t.mask2]  
                                 test    si, si  
                                 je              short egcww_ed  
                                 mov             di, si  
                                 not             di  
                                 mov             dl, [_egc + egc_t.access]  
 egcww_wb:               shr             dl, 1  
                                 jc              short egcww_wr  
                                 and             [VIDEOMEMORY + ebp + VRAM_B], di  
                                 mov             ax, [ecx + 0]  
                                 and             ax, si  
                                 or              [VIDEOMEMORY + ebp + VRAM_B], ax  
 egcww_wr:               shr             dl, 1  
                                 jc              short egcww_wg  
                                 and             [VIDEOMEMORY + ebp + VRAM_R], di  
                                 mov             ax, [ecx + 2]  
                                 and             ax, si  
                                 or              [VIDEOMEMORY + ebp + VRAM_R], ax  
 egcww_wg:               shr             dl, 1  
                                 jc              short egcww_we  
                                 and             [VIDEOMEMORY + ebp + VRAM_G], di  
                                 mov             ax, [ecx + 4]  
                                 and             ax, si  
                                 or              [VIDEOMEMORY + ebp + VRAM_G], ax  
 egcww_we:               shr             dl, 1  
                                 jc              short egcww_ed  
                                 and             [VIDEOMEMORY + ebp + VRAM_E], di  
                                 mov             ax, [ecx + 6]  
                                 and             ax, si  
                                 or              [VIDEOMEMORY + ebp + VRAM_E], ax  
 egcww_ed:               popad  
                                 ret  
   
                                 align   4  
 egcww_odd:              test    byte [_egc + egc_t.sft + 1], 10h  
                                 jne             short egcww_oddr  
                                 call    egc_write  
                                 pushad  
                                 inc             ecx  
                                 mov             dl, dh  
                                 jmp             egc_write_m  
 egcww_oddr:             push    dword egc_write  
                                 pushad  
                                 inc             ecx  
                                 mov             dl, dh  
                                 jmp             egc_write_m  
   
         ends  
   

Removed from v.1.5  
changed lines
  Added in v.1.6


RetroPC.NET-CVS <cvs@retropc.net>