|
|
| version 1.10, 2004/01/28 23:36:13 | version 1.15, 2005/05/20 13:59:47 |
|---|---|
| Line 2 | Line 2 |
| ; | ; |
| ; ToDo: egc word-boundary | ; ToDo: egc word-boundary |
| %include 'x86/np2asm.inc' | %include 'np2asm.inc' |
| %include 'cpucore.inc' | |
| %include 'iocore.inc' | |
| %include 'vram.inc' | |
| section .bss | section .bss |
| global _mem | global _mem |
| extern _i286core | extern _i286core |
| extern _grcg | |
| extern _gdcs | |
| extern _tramupdate | extern _tramupdate |
| extern _vramupdate | extern _vramupdate |
| extern _cgwindow | |
| extern _vramop | extern _vramop |
| _mem resb 0x200000 | _mem resb 0x200000 |
| Line 23 EXTMEMORY equ 0 | Line 23 EXTMEMORY equ 0 |
| VIDEOMEMORY equ _mem | VIDEOMEMORY equ _mem |
| USERSMEMORY_R equ 0a8000h | USERSMEMORY_R equ 0a8000h |
| USERSMEMORY_W equ 0a0000h | USERSMEMORY_W equ 0a0000h |
| _extmemmng_ptr equ _i286core + i286core_t.ext | _extmemmng_ptr equ _i286core + cpucore_t.ext |
| _extmemmng_size equ _i286core + i286core_t.extsize | _extmemmng_size equ _i286core + cpucore_t.extsize |
| %if 1 | %if 1 |
| _font equ _mem + FONT_ADRS | _font equ _mem + FONT_ADRS |
| Line 82 section .text | Line 82 section .text |
| %if USE_EGCASM | %if USE_EGCASM |
| extern _egca_read | extern egc_read |
| extern _egca_read_w | extern egc_read_w |
| extern _egca_write | extern egc_write |
| extern _egca_write_w | extern egc_write_w |
| %else | %else |
| extern @egc_read@4 | extern @memegc_rd8@4 |
| extern @egc_read_w@4 | extern @memegc_rd16@4 |
| extern @egc_write@8 | extern @memegc_wr8@8 |
| extern @egc_write_w@8 | extern @memegc_wr16@8 |
| %endif | %endif |
| ; normal memory | ; normal memory |
| align 16 | align 16 |
| @i286_wt: mov ebx, ecx | @i286_wt: mov ebx, ecx |
| and ebx, [_i286core + i286core_t.adrsmask] | and ebx, [_i286core + cpucore_t.adrsmask] |
| mov [MAINMEMORY + ebx], dl | mov [MAINMEMORY + ebx], dl |
| pop ebx | pop ebx |
| ret | ret |
| Line 104 section .text | Line 104 section .text |
| ; tram write | ; tram write |
| align 16 | align 16 |
| @tram_wt: mov ebx, [_vramop + vramop_t.tramwait] | @tram_wt: mov ebx, [_vramop + vramop_t.tramwait] |
| sub [_i286core + i286core_t.remainclock], ebx | sub [_i286core + cpucore_t.remainclock], ebx |
| mov ebx, ecx | mov ebx, ecx |
| cmp ecx, 000a2000h | cmp ecx, 000a2000h |
| jnc short wtram_a | jnc short wtram_a |
| Line 155 wcgwindow_e: pop ebx | Line 155 wcgwindow_e: pop ebx |
| or byte [_vramupdate + ebx], 1 | or byte [_vramupdate + ebx], 1 |
| or byte [_gdcs + gdcs_t.grphdisp], 1 | or byte [_gdcs + gdcs_t.grphdisp], 1 |
| mov ebx, [_vramop + vramop_t.vramwait] | mov ebx, [_vramop + vramop_t.vramwait] |
| sub [_i286core + i286core_t.remainclock], ebx | sub [_i286core + cpucore_t.remainclock], ebx |
| pop ebx | pop ebx |
| ret | ret |
| Line 167 wcgwindow_e: pop ebx | Line 167 wcgwindow_e: pop ebx |
| or byte [_vramupdate + ebx], 2 | or byte [_vramupdate + ebx], 2 |
| or byte [_gdcs + gdcs_t.grphdisp], 2 | or byte [_gdcs + gdcs_t.grphdisp], 2 |
| mov ebx, [_vramop + vramop_t.vramwait] | mov ebx, [_vramop + vramop_t.vramwait] |
| sub [_i286core + i286core_t.remainclock], ebx | sub [_i286core + cpucore_t.remainclock], ebx |
| pop ebx | pop ebx |
| ret | ret |
| Line 188 wcgwindow_e: pop ebx | Line 188 wcgwindow_e: pop ebx |
| or byte [_gdcs + gdcs_t.grphdisp], 1 | or byte [_gdcs + gdcs_t.grphdisp], 1 |
| grcg_rmw: mov ebx, [_vramop + vramop_t.grcgwait] | grcg_rmw: mov ebx, [_vramop + vramop_t.grcgwait] |
| sub [_i286core + i286core_t.remainclock], ebx | sub [_i286core + cpucore_t.remainclock], ebx |
| mov ebx, dword [_grcg + grcg_t.mode] | mov ebx, dword [_grcg + grcg_t.mode] |
| mov bl, dl | mov bl, dl |
| not bl | not bl |
| Line 237 grcgrmw_end: pop ecx | Line 237 grcgrmw_end: pop ecx |
| or byte [_gdcs + gdcs_t.grphdisp], 1 | or byte [_gdcs + gdcs_t.grphdisp], 1 |
| grcg_tdw: mov ebx, [_vramop + vramop_t.grcgwait] | grcg_tdw: mov ebx, [_vramop + vramop_t.grcgwait] |
| sub [_i286core + i286core_t.remainclock], ebx | sub [_i286core + cpucore_t.remainclock], ebx |
| mov bh, [_grcg + grcg_t.modereg] | mov bh, [_grcg + grcg_t.modereg] |
| shr bh, 1 | shr bh, 1 |
| jc short grcgtdw_r | jc short grcgtdw_r |
| Line 262 grcgtdw_end: pop ecx | Line 262 grcgtdw_end: pop ecx |
| ; EGC bridge | ; EGC bridge |
| align 16 | align 16 |
| @egc_wt: VRAMTRACE | @egc_wt: VRAMTRACE |
| mov ebx, [_vramop + vramop_t.grcgwait] | |
| sub [_i286core + cpucore_t.remainclock], ebx | |
| pop ebx | pop ebx |
| %if USE_EGCASM | %if USE_EGCASM |
| jmp _egca_write | jmp egc_write |
| %else | %else |
| pushad | pushad |
| call @egc_write@8 | call @memegc_wr8@8 |
| popad | popad |
| ret | ret |
| %endif | %endif |
| Line 279 grcgtdw_end: pop ecx | Line 281 grcgtdw_end: pop ecx |
| and ecx, 3fffh | and ecx, 3fffh |
| shr ebx, 12 | shr ebx, 12 |
| and ebx, byte (3*4) | and ebx, byte (3*4) |
| add ecx, [_i286core + i286core_t.ems + ebx] | add ecx, [_i286core + cpucore_t.ems + ebx] |
| mov [EXTMEMORY + ecx], dl | mov [EXTMEMORY + ecx], dl |
| pop ecx | pop ecx |
| pop ebx | pop ebx |
| Line 300 grcgtdw_end: pop ecx | Line 302 grcgtdw_end: pop ecx |
| ; normal memory | ; normal memory |
| align 16 | align 16 |
| @i286_rd: mov ebx, ecx | @i286_rd: mov ebx, ecx |
| and ebx, [_i286core + i286core_t.adrsmask] | and ebx, [_i286core + cpucore_t.adrsmask] |
| mov al, [MAINMEMORY + ebx] | mov al, [MAINMEMORY + ebx] |
| pop ebx | pop ebx |
| ret | ret |
| Line 308 grcgtdw_end: pop ecx | Line 310 grcgtdw_end: pop ecx |
| ; font cg-window | ; font cg-window |
| align 16 | align 16 |
| @tram_rd: mov ebx, [_vramop + vramop_t.tramwait] | @tram_rd: mov ebx, [_vramop + vramop_t.tramwait] |
| sub [_i286core + i286core_t.remainclock], ebx | sub [_i286core + cpucore_t.remainclock], ebx |
| cmp ecx, 0a4000h | cmp ecx, 0a4000h |
| jnc rcgwindow_s | jnc rcgwindow_s |
| rcgwindow_n: mov al, [MAINMEMORY + ecx] | rcgwindow_n: mov al, [MAINMEMORY + ecx] |
| Line 331 rcgwindow_s: cmp ecx, 0a5000h | Line 333 rcgwindow_s: cmp ecx, 0a5000h |
| align 16 | align 16 |
| @vram_r0: mov al, [VIDEOMEMORY + ecx] | @vram_r0: mov al, [VIDEOMEMORY + ecx] |
| mov ebx, [_vramop + vramop_t.vramwait] | mov ebx, [_vramop + vramop_t.vramwait] |
| sub [_i286core + i286core_t.remainclock], ebx | sub [_i286core + cpucore_t.remainclock], ebx |
| pop ebx | pop ebx |
| ret | ret |
| Line 339 rcgwindow_s: cmp ecx, 0a5000h | Line 341 rcgwindow_s: cmp ecx, 0a5000h |
| align 16 | align 16 |
| @vram_r1: mov al, [VIDEOMEMORY + VRAM_STEP + ecx] | @vram_r1: mov al, [VIDEOMEMORY + VRAM_STEP + ecx] |
| mov ebx, [_vramop + vramop_t.vramwait] | mov ebx, [_vramop + vramop_t.vramwait] |
| sub [_i286core + i286core_t.remainclock], ebx | sub [_i286core + cpucore_t.remainclock], ebx |
| pop ebx | pop ebx |
| ret | ret |
| Line 354 rcgwindow_s: cmp ecx, 0a5000h | Line 356 rcgwindow_s: cmp ecx, 0a5000h |
| and ecx, 7fffh | and ecx, 7fffh |
| grcg_tcr: mov ebx, [_vramop + vramop_t.grcgwait] | grcg_tcr: mov ebx, [_vramop + vramop_t.grcgwait] |
| sub [_i286core + i286core_t.remainclock], ebx | sub [_i286core + cpucore_t.remainclock], ebx |
| mov al, 0 | mov al, 0 |
| mov bh, [_grcg + grcg_t.modereg] | mov bh, [_grcg + grcg_t.modereg] |
| shr bh, 1 | shr bh, 1 |
| Line 383 grcgtcr_end: not al | Line 385 grcgtcr_end: not al |
| ; EGC bridge | ; EGC bridge |
| align 16 | align 16 |
| @egc_rd: pop ebx | @egc_rd: mov ebx, [_vramop + vramop_t.grcgwait] |
| sub [_i286core + cpucore_t.remainclock], ebx | |
| pop ebx | |
| %if USE_EGCASM | %if USE_EGCASM |
| jmp _egca_read | jmp egc_read |
| %else | %else |
| pushad | pushad |
| call @egc_read@4 | call @memegc_rd8@4 |
| mov [esp + 28], al | mov [esp + 28], al |
| popad | popad |
| ret | ret |
| Line 402 grcgtcr_end: not al | Line 406 grcgtcr_end: not al |
| and ecx, 3fffh | and ecx, 3fffh |
| shr ebx, 12 | shr ebx, 12 |
| and ebx, byte (3*4) | and ebx, byte (3*4) |
| add ecx, [_i286core + i286core_t.ems + ebx] | add ecx, [_i286core + cpucore_t.ems + ebx] |
| mov al, [EXTMEMORY + ecx] | mov al, [EXTMEMORY + ecx] |
| pop ecx | pop ecx |
| pop ebx | pop ebx |
| Line 411 grcgtcr_end: not al | Line 415 grcgtcr_end: not al |
| ; BIOS or ITF | ; BIOS or ITF |
| align 16 | align 16 |
| @i286_rb: pop ebx | @i286_rb: pop ebx |
| cmp byte [_i286core + i286core_t.itfbank], 0 | cmp byte [_i286core + cpucore_t.itfbank], 0 |
| jne readmem_itf | jne readmem_itf |
| mov al, [MAINMEMORY + ecx] | mov al, [MAINMEMORY + ecx] |
| ret | ret |
| Line 423 readmem_itf: mov al, [MAINMEMORY + VRA | Line 427 readmem_itf: mov al, [MAINMEMORY + VRA |
| ; normal memory | ; normal memory |
| align 16 | align 16 |
| @i286w_wt: mov ebx, ecx | @i286w_wt: mov ebx, ecx |
| and ebx, [_i286core + i286core_t.adrsmask] | and ebx, [_i286core + cpucore_t.adrsmask] |
| mov [MAINMEMORY + ebx], dx | mov [MAINMEMORY + ebx], dx |
| pop ebx | pop ebx |
| ret | ret |
| Line 431 readmem_itf: mov al, [MAINMEMORY + VRA | Line 435 readmem_itf: mov al, [MAINMEMORY + VRA |
| ; tram write | ; tram write |
| align 16 | align 16 |
| @tramw_wt: mov ebx, [_vramop + vramop_t.tramwait] | @tramw_wt: mov ebx, [_vramop + vramop_t.tramwait] |
| sub [_i286core + i286core_t.remainclock], ebx | sub [_i286core + cpucore_t.remainclock], ebx |
| mov ebx, ecx | mov ebx, ecx |
| cmp ecx, 000a1fffh | cmp ecx, 000a1fffh |
| jnc short wtramw_a | jnc short wtramw_a |
| Line 508 wcgwinw_odd: add ebx, dword [_cgwindow | Line 512 wcgwinw_odd: add ebx, dword [_cgwindow |
| or word [_vramupdate + ebx], 0101h | or word [_vramupdate + ebx], 0101h |
| or byte [_gdcs + gdcs_t.grphdisp], 1 | or byte [_gdcs + gdcs_t.grphdisp], 1 |
| mov ebx, [_vramop + vramop_t.vramwait] | mov ebx, [_vramop + vramop_t.vramwait] |
| sub [_i286core + i286core_t.remainclock], ebx | sub [_i286core + cpucore_t.remainclock], ebx |
| pop ebx | pop ebx |
| ret | ret |
| Line 520 wcgwinw_odd: add ebx, dword [_cgwindow | Line 524 wcgwinw_odd: add ebx, dword [_cgwindow |
| or word [_vramupdate + ebx], 0202h | or word [_vramupdate + ebx], 0202h |
| or byte [_gdcs + gdcs_t.grphdisp], 2 | or byte [_gdcs + gdcs_t.grphdisp], 2 |
| mov ebx, [_vramop + vramop_t.vramwait] | mov ebx, [_vramop + vramop_t.vramwait] |
| sub [_i286core + i286core_t.remainclock], ebx | sub [_i286core + cpucore_t.remainclock], ebx |
| pop ebx | pop ebx |
| ret | ret |
| Line 541 wcgwinw_odd: add ebx, dword [_cgwindow | Line 545 wcgwinw_odd: add ebx, dword [_cgwindow |
| or byte [_gdcs + gdcs_t.grphdisp], 1 | or byte [_gdcs + gdcs_t.grphdisp], 1 |
| grcgw_rmw: mov ebx, [_vramop + vramop_t.grcgwait] | grcgw_rmw: mov ebx, [_vramop + vramop_t.grcgwait] |
| sub [_i286core + i286core_t.remainclock], ebx | sub [_i286core + cpucore_t.remainclock], ebx |
| push eax | push eax |
| mov ebx, dword [_grcg + grcg_t.mode] | mov ebx, dword [_grcg + grcg_t.mode] |
| mov bx, dx | mov bx, dx |
| Line 592 grcgwrmw_end: pop eax | Line 596 grcgwrmw_end: pop eax |
| or byte [_gdcs + gdcs_t.grphdisp], 1 | or byte [_gdcs + gdcs_t.grphdisp], 1 |
| grcgw_tdw: mov ebx, [_vramop + vramop_t.grcgwait] | grcgw_tdw: mov ebx, [_vramop + vramop_t.grcgwait] |
| sub [_i286core + i286core_t.remainclock], ebx | sub [_i286core + cpucore_t.remainclock], ebx |
| mov ebx, [_grcg + grcg_t.mode] | mov ebx, [_grcg + grcg_t.mode] |
| test ebx, 010000h | test ebx, 010000h |
| jne short grcgwtdw_r | jne short grcgwtdw_r |
| Line 617 grcgwtdw_end: pop ecx | Line 621 grcgwtdw_end: pop ecx |
| ; EGC bridge | ; EGC bridge |
| align 16 | align 16 |
| @egcw_wt: VRAMTRACE_W | @egcw_wt: VRAMTRACE_W |
| mov ebx, [_vramop + vramop_t.grcgwait] | |
| sub [_i286core + cpucore_t.remainclock], ebx | |
| pop ebx | pop ebx |
| %if USE_EGCASM | %if USE_EGCASM |
| jmp _egca_write_w | jmp egc_write_w |
| %else | %else |
| test ecx, 1 | |
| jne short egcw_wtodd | |
| pushad | pushad |
| call @egc_write_w@8 | call @memegc_wr16@8 |
| popad | |
| ret | |
| egcw_wtodd: | |
| pushad | |
| push ecx | |
| push edx | |
| call @egc_write@8 | |
| pop edx | |
| pop ecx | |
| inc ecx | |
| shr edx, 8 | |
| call @egc_write@8 | |
| popad | popad |
| ret | ret |
| %endif | %endif |
| Line 648 egcw_wtodd: | Line 640 egcw_wtodd: |
| and ecx, 3fffh | and ecx, 3fffh |
| shr ebx, 12 | shr ebx, 12 |
| and ebx, byte (3*4) | and ebx, byte (3*4) |
| add ecx, [_i286core + i286core_t.ems + ebx] | add ecx, [_i286core + cpucore_t.ems + ebx] |
| mov [EXTMEMORY + ecx], dx | mov [EXTMEMORY + ecx], dx |
| pop ecx | pop ecx |
| pop ebx | pop ebx |
| Line 663 egcw_wtodd: | Line 655 egcw_wtodd: |
| ; normal memory | ; normal memory |
| align 16 | align 16 |
| @i286w_rd: mov ebx, ecx | @i286w_rd: mov ebx, ecx |
| and ebx, [_i286core + i286core_t.adrsmask] | and ebx, [_i286core + cpucore_t.adrsmask] |
| mov ax, [MAINMEMORY + ebx] | mov ax, [MAINMEMORY + ebx] |
| pop ebx | pop ebx |
| ret | ret |
| Line 671 egcw_wtodd: | Line 663 egcw_wtodd: |
| ; font cg-window | ; font cg-window |
| align 16 | align 16 |
| @tramw_rd: mov ebx, [_vramop + vramop_t.tramwait] | @tramw_rd: mov ebx, [_vramop + vramop_t.tramwait] |
| sub [_i286core + i286core_t.remainclock], ebx | sub [_i286core + cpucore_t.remainclock], ebx |
| cmp ecx, 0a3fffh | cmp ecx, 0a3fffh |
| jnc rcgwwindow_s | jnc rcgwwindow_s |
| mov ax, [MAINMEMORY + ecx] | mov ax, [MAINMEMORY + ecx] |
| Line 725 rcgwwindow_a4fff: mov ebx, dword [_cgwi | Line 717 rcgwwindow_a4fff: mov ebx, dword [_cgwi |
| align 16 | align 16 |
| @vramw_r0: mov ax, [VIDEOMEMORY + ecx] | @vramw_r0: mov ax, [VIDEOMEMORY + ecx] |
| mov ebx, [_vramop + vramop_t.vramwait] | mov ebx, [_vramop + vramop_t.vramwait] |
| sub [_i286core + i286core_t.remainclock], ebx | sub [_i286core + cpucore_t.remainclock], ebx |
| pop ebx | pop ebx |
| ret | ret |
| Line 733 rcgwwindow_a4fff: mov ebx, dword [_cgwi | Line 725 rcgwwindow_a4fff: mov ebx, dword [_cgwi |
| align 16 | align 16 |
| @vramw_r1: mov ax, [VIDEOMEMORY + VRAM_STEP + ecx] | @vramw_r1: mov ax, [VIDEOMEMORY + VRAM_STEP + ecx] |
| mov ebx, [_vramop + vramop_t.vramwait] | mov ebx, [_vramop + vramop_t.vramwait] |
| sub [_i286core + i286core_t.remainclock], ebx | sub [_i286core + cpucore_t.remainclock], ebx |
| pop ebx | pop ebx |
| ret | ret |
| Line 748 rcgwwindow_a4fff: mov ebx, dword [_cgwi | Line 740 rcgwwindow_a4fff: mov ebx, dword [_cgwi |
| and ecx, 7fffh | and ecx, 7fffh |
| grcgw_tcr: mov ebx, [_vramop + vramop_t.grcgwait] | grcgw_tcr: mov ebx, [_vramop + vramop_t.grcgwait] |
| sub [_i286core + i286core_t.remainclock], ebx | sub [_i286core + cpucore_t.remainclock], ebx |
| mov ax, 0 | mov ax, 0 |
| mov ebx, [_grcg + grcg_t.mode] | mov ebx, [_grcg + grcg_t.mode] |
| test ebx, 010000h | test ebx, 010000h |
| Line 777 grcgwtcr_end: not ax | Line 769 grcgwtcr_end: not ax |
| ; EGC bridge | ; EGC bridge |
| align 16 | align 16 |
| @egcw_rd: pop ebx | @egcw_rd: mov ebx, [_vramop + vramop_t.grcgwait] |
| test ecx, 1 | sub [_i286core + cpucore_t.remainclock], ebx |
| jne short egcw_rdodd | pop ebx |
| %if USE_EGCASM | %if USE_EGCASM |
| jmp _egca_read_w | jmp egc_read_w |
| %else | %else |
| pushad | pushad |
| call @egc_read_w@4 | call @memegc_rd16@4 |
| mov [esp + 28], ax | mov [esp + 28], ax |
| popad | popad |
| ret | ret |
| %endif | %endif |
| egcw_rdodd: | |
| %if USE_EGCASM | |
| inc ecx | |
| call _egca_read | |
| mov ah, al | |
| dec ecx | |
| jmp _egca_read | |
| %else | |
| pushad | |
| push ecx | |
| call @egc_read@4 | |
| pop ecx | |
| mov [esp+28], al | |
| inc ecx | |
| call @egc_read@4 | |
| mov [esp+29], al | |
| popad | |
| %endif | |
| ret | |
| ; EMM read | ; EMM read |
| align 16 | align 16 |
| Line 817 egcw_rdodd: | Line 790 egcw_rdodd: |
| and ecx, 3fffh | and ecx, 3fffh |
| shr ebx, 12 | shr ebx, 12 |
| and ebx, byte (3*4) | and ebx, byte (3*4) |
| add ecx, [_i286core + i286core_t.ems + ebx] | add ecx, [_i286core + cpucore_t.ems + ebx] |
| mov ax, [EXTMEMORY + ecx] | mov ax, [EXTMEMORY + ecx] |
| pop ecx | pop ecx |
| pop ebx | pop ebx |
| Line 826 egcw_rdodd: | Line 799 egcw_rdodd: |
| ; BIOS or ITF | ; BIOS or ITF |
| align 16 | align 16 |
| @i286w_rb: pop ebx | @i286w_rb: pop ebx |
| cmp byte [_i286core + i286core_t.itfbank], 0 | cmp byte [_i286core + cpucore_t.itfbank], 0 |
| jne readwmem_itf | jne readwmem_itf |
| mov ax, [MAINMEMORY + ecx] | mov ax, [MAINMEMORY + ecx] |
| ret | ret |