--- np2/i286x/Attic/egcmem.x86 2004/02/18 02:03:36 1.5 +++ np2/i286x/Attic/egcmem.x86 2005/02/08 09:18:59 1.6 @@ -1,1101 +1,3 @@ -; egc - asm version -; -; asm version: egcasm.asm + egc.c -%include 'x86/np2asm.inc' - -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 +#error move: /mem/x86/memegc.x86