|
|
| version 1.1, 2005/02/08 09:57:27 | version 1.4, 2005/05/20 13:59:48 |
|---|---|
| Line 1 | Line 1 |
| struc dmach_t | %include 'iocore.inc' |
| .adrs resd 1 ; 00 | |
| .leng resw 1 ; 04 | |
| .adrsorg resw 1 ; 06 | |
| .lengorg resw 1 ; 08 | |
| .action resw 1 ; 0a | |
| .outproc resd 1 ; 0c | |
| .inproc resd 1 ; 10 | |
| .extproc resd 1 ; 14 | |
| .mode resb 1 ; 18 | |
| .sreq resb 1 ; 19 | |
| .ready resb 1 ; 1a | |
| .mask resb 1 ; 1b | |
| .size ; 1c | |
| endstruc | |
| struc dmac_t | |
| .dmach resb (dmach_t.size * 4) | |
| .lh resd 1 | |
| .work resb 1 | |
| .working resb 1 | |
| .mask resb 1 | |
| .stat resb 1 | |
| endstruc | |
| DMAEXT_START equ 0 | |
| DMAEXT_END equ 1 | |
| DMAEXT_BREAK equ 2 | |
| DMA_INITSIGNALONLY equ 1 | |
| section .bss | |
| extern _dmac | |
| section .text | section .text |
| Line 43 section .text | Line 10 section .text |
| align 16 | align 16 |
| _dmax86: cmp byte [_dmac + dmac_t.working], byte 0 | _dmax86: cmp byte [_dmac + dmac_t.working], byte 0 |
| je short dmap_nowork | je short .nowork |
| mov eax, _dmac + dmac_t.dmach | |
| mov cl, 1 | mov cl, 1 |
| dmap_sea: test [_dmac + dmac_t.working], cl | mov eax, _dmac + dmac_t.dmach |
| jne short dmap_hit | .sea: test [_dmac + dmac_t.working], cl |
| jne short .hit | |
| add cl, cl | add cl, cl |
| add eax, dmach_t.size | add eax, byte dmach_t.size |
| and cl, 15 | test cl, 15 |
| jne short dmap_sea | jne short .sea |
| dmap_nowork: ret | .nowork: ret |
| dmap_hit: push edi | .hit: push edi |
| sub word [eax + dmach_t.leng], byte 1 | sub word [eax + dmach_t.leng], byte 1 |
| mov edi, eax | mov edi, eax |
| jnc short dmap_exec | jnc short .exec |
| or [_dmac + dmac_t.stat], cl | or [_dmac + dmac_t.stat], cl |
| not cl | not cl |
| and [_dmac + dmac_t.working], cl | and [_dmac + dmac_t.working], cl |
| mov ecx, DMAEXT_END | mov ecx, DMAEXT_END |
| call dword [edi + dmach_t.extproc] | call dword [edi + dmach_t.extproc] |
| dmap_exec: mov al, [edi + dmach_t.mode] | .exec: mov al, [edi + dmach_t.mode] |
| and al, 0ch | and al, 0x0c |
| je short dmap_verify | je short .verify |
| cmp al, 04h | cmp al, 0x04 |
| je short dmap_port2mem | je short .port2mem |
| mov ecx, [edi + dmach_t.adrs] | mov ecx, [edi + dmach_t.adrs] |
| call @i286_memoryread@4 | call @i286_memoryread@4 |
| mov cl, al | mov cl, al |
| call dword [edi + dmach_t.outproc] | call dword [edi + dmach_t.outproc] |
| jmp short dmap_inccnt | jmp short .inccnt |
| dmap_verify: call dword [edi + dmach_t.inproc] | .verify: call dword [edi + dmach_t.inproc] |
| jmp short dmap_inccnt | jmp short .inccnt |
| dmap_port2mem: call dword [edi + dmach_t.inproc] | .port2mem: call dword [edi + dmach_t.inproc] |
| mov ecx, [edi + dmach_t.adrs] | mov ecx, [edi + dmach_t.adrs] |
| mov dl, al | mov dl, al |
| call @i286_memorywrite@8 | call @i286_memorywrite@8 |
| dmap_inccnt: test byte [edi + dmach_t.mode], 20h | .inccnt: test byte [edi + dmach_t.mode], 0x20 |
| jne short dmap_adrsdec | jne short .adrsdec |
| inc dword [edi + dmach_t.adrs] | inc dword [edi + dmach_t.adrs] |
| pop edi | pop edi |
| ret | ret |
| dmap_adrsdec: dec dword [edi + dmach_t.adrs] | .adrsdec: dec dword [edi + dmach_t.adrs] |
| pop edi | pop edi |
| ret | ret |