Попробовал поставить 8237 вместо ВТ57 и конечно одержал фейл. Первое, что заметил, что на схеме в декодере адреса порта для ВТ57 на u16 и u28:A не реализовано декодирование 0xc,0xd,0xf, таким образом мы лишаемся возможности юзать команды 8237 такие как:
Clear Byte Pointer Flip/Flop (0xc);
Master Clear (0xd);
Write All Mask register bits (0xf);
Но решил все-таки попробовать без них, хотя в доке явно пишут, что надо бы перед записью адресов и счетчиков дать команду Clear Byte Pointer Flip/Flops, что бы привести конечную машину в известное состояние. Но я понадеялся что после резета оно там будет известное, и обойдемся без нее.
Сделал так:
Код:
;8237 command reg
mem_to_mem equ 1
ch0_adr_hold equ 2
controller_disable equ 4
fast_timing equ 8
rotating_priority equ 16
extended_write equ 32
dreq_active_low equ 64
dack_active_high equ 128
;8237 mode reg
verify_transfer equ 2
write_transfer equ 4
read_transfer equ 8
autoinit equ 16
addr_decrement equ 32
single_mode equ 64
block_mode equ 128
cascade_mode equ 192
;8237 request reg
request_bit equ 4
;8237 channel mask
channel0 equ 0
channel1 equ 1
channel2 equ 2
channel3 equ 3
vt37_cmd equ io_adr+018h ; DMA control reg
vt37_request equ io_adr+019h ; DMA request reg
vt37_single_mask equ io_adr+01ah
vt37_mode equ io_adr+01bh ; DMA mode reg
;no actual hw
vt37_clr_ptr equ io_adr+01ch
vt37_reset equ io_adr+01dh
vt37_all_mask equ io_adr+01fh
;DMA run subroutine
run_DMA proc near
ifdef VT37
;8237 DMA init
cli ;Disable interrupts
mov dx,vt57_ch2_adr
mov al,0
out dx,al ;set starting adress
out dx,al
inc dx
mov al,09fh
out dx,al
mov al,0fh
out dx,al
mov dx,vt37_mode
mov al,channel2 or autoinit or read_transfer
out dx,al
mov dx,vt37_request
mov al,channel2 or request_bit
out dx,al
mov dx,vt37_cmd
mov al,0
out dx,al
mov dx,vt37_single_mask
mov al,channel2
out dx,al
sti ;Enable interrupts
ret
endif
Но картинки не получил. Иногда вижу какой-то мусор, если активно в память писать, но это не нормальное содержимое. Что-то пошло явно не так...
UPD: Притянул 36 ножку /EOP к питанию, DMA начало стартовать, но вроде проходит один цикл и встает.