; egc - asm version %include 'cpucore.inc' %include 'iocore.inc' section .bss extern _mem extern _vramupdate global _egc_src global _egc_data global _egc_dst global _egc_pat global _egcshift global @egc_readbyte@4 global @egc_writebyte@8 global @egc_readword@4 global @egc_writeword@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 .rdata 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 short .dircalced add edx, 512 + 3 .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 .funcrst ; srcbit == dstbit jc short .difm add edx, byte 4 ; srcbit > dstbit jmp short .difcal .difm: add edx, byte 2 ; srcbit < dstbit add al, 8 .difcal: mov [_egc + egc_t.sft8bitl], al dec al ; +-- al = 8 - al xor al, 7 ; + mov [_egc + egc_t.sft8bitr], al .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], byte 8 jnc short estb_upls_cal xor edx, edx xchg edx, [_egc + egc_t.remain] add edx, byte (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], byte 8 jnc short estb_uprs_cal xchg eax, [_egc + egc_t.remain] add eax, byte (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], byte 8 jnc short estb_dnns_cal xor edx, edx xchg edx, [_egc + egc_t.remain] add edx, byte (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], byte 8 jnc short estb_dnls_cal xor edx, edx xchg edx, [_egc + egc_t.remain] add edx, byte (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], byte 8 jnc short estb_dnrs_cal xor edx, edx xchg edx, [_egc + egc_t.remain] add edx, byte (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 .opesrc mov edx, _egc + egc_t.bgc cmp al, 20h je short .loadvram mov edx, _egc + egc_t.fgc jmp short .loadvram .opesrc: mov al, [_egc + egc_t.ope + 1] and al, 3 cmp al, 1 mov edx, _egc_src je short .loadvram mov edx, _egc + egc_t.patreg .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 .ope80: add cl, cl jnc short .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 .ope40: add cl, cl jnc short .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 .ope20: add cl, cl jnc short .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 .ope10: add cl, cl jnc short .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 .ope08: add cl, cl jnc short .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 .ope04: add cl, cl jnc short .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 .ope02: add cl, cl jnc short .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 .ope01: add cl, cl jnc short .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 .ope00: ret ; ---- byte access align 16 @egc_readbyte@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_writebyte@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_readword@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_writeword@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