%include 'iocore.inc'
section .text
global _dmax86
extern @i286_memoryread@4
extern @i286_memorywrite@8
align 16
_dmax86: cmp byte [_dmac + dmac_t.working], byte 0
je short .nowork
mov cl, 1
mov eax, _dmac + dmac_t.dmach
.sea: test [_dmac + dmac_t.working], cl
jne short .hit
add cl, cl
add eax, byte dmach_t_size
test cl, 15
jne short .sea
.nowork: ret
.hit: push edi
sub word [eax + dmach_t.leng], byte 1
mov edi, eax
jnc short .exec
or [_dmac + dmac_t.stat], cl
not cl
and [_dmac + dmac_t.working], cl
mov ecx, DMAEXT_END
call dword [edi + dmach_t.extproc]
.exec: mov al, [edi + dmach_t.mode]
and al, 0x0c
je short .verify
cmp al, 0x04
je short .port2mem
mov ecx, [edi + dmach_t.adrs]
call @i286_memoryread@4
mov cl, al
call dword [edi + dmach_t.outproc]
jmp short .inccnt
.verify: call dword [edi + dmach_t.inproc]
jmp short .inccnt
.port2mem: call dword [edi + dmach_t.inproc]
mov ecx, [edi + dmach_t.adrs]
mov dl, al
call @i286_memorywrite@8
.inccnt: test byte [edi + dmach_t.mode], 0x20
jne short .adrsdec
inc dword [edi + dmach_t.adrs]
pop edi
ret
.adrsdec: dec dword [edi + dmach_t.adrs]
pop edi
ret
RetroPC.NET-CVS <cvs@retropc.net>