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