Значит попала ко мне плата от какого-то старого принт-сервера с тремя LPT-портами. Выглядит так:
Большая фотка без рекламы без СМС
Железка сама по себе мертвая, не интересная в текущих реалиях, со следами ковыряния в районе стаба питания. На железке срама 611024 две штуки, под срамой две флехи 29F002. В этом же районе две защелки 74HC373 и самое интересное - камень Am186em-40, то есть 40MHz. Он в левом верхнем углу. Дальше там по середине неведомый чип EK10A002 SC001/58200001 и в правом верхнем углу PHY-ethernet DM9102F. И рассыпуха везде по мелочи.
Сначала хотел просто сраму и флехи повыдирать, остальное в утиль. Но так как с 8086 у меня дружеские отношения (кодил давно в детстве на ассемблере) захотелось чего-то запустить железяку. Ностальгия что-ли давит, не знаю. Ну починил конечно питание, 5V там везде на плате, просто все. Адски грелась DM9102F, снял ее. Запаял панельки под EEPROM, чтоб удобнее шить было. Считал оригинальную прошивку, по ней выходит, что принт-сервер вроде как от фирмы SerComm. Выложил на всякий случай сюда: https://dl.dropboxusercontent.com/u/3318932...rint_server.rar
И дальше стал искать, чего бы собственно прошить. Набрел на некий E86MON от самой AMD, еле нашел. Гуглится по названию архива ck000901.zip , скачивается с сайта datasheetsarchive (я удивился, что у них не только PDF хранятся, но и ZIP). Ну скачал, поднял виртуалку с досом и win3.11, поставил Microsoft C какой-то древний, MASM. Скомпилял, разделил на две половины чет/нечет, прошился. К процу подпаялся на ноги RX/TX. Включил - ничего не выводит в терминал.
Ладно, беру китай-клон Saleae восьмиканальный, паяюсь на шину AD0-AD7:
Смотрю - движуха какая-то есть:

Причем похоже вроде на старт - там в прошивке идет первая команда перехода jpm far (0xEA), потом F8 - начало адреса сегмента. Между ними проскакивает сами адреса. Шина 16-ти битная, каналов всего 8 у анализатора - не могу всю картину увидеть. Но вроде движется что-то куда-то. Значит проц живой по идее.
Ладно, лезу в исходники того самого E86MON, хочу практически сразу после старта начать валить в UART какой-нибудь символ, пускай "2". Оставляю настройку UMCS и LMCS:
Код
mov ax, CS_UMCS_512K+CS_WAIT3+CS_IGXRDY+CS_UMCS_RESERVED ;ПЗУ-хи
out dx,al
; setup LMCS register to cover entire RAM area at 0 wait states
;
mov dx, CS_LMCS ;срама
mov ax, CS_LMCS_512K+CS_WAIT0+CS_IGXRDY
out dx,al
out dx,al
; setup LMCS register to cover entire RAM area at 0 wait states
;
mov dx, CS_LMCS ;срама
mov ax, CS_LMCS_512K+CS_WAIT0+CS_IGXRDY
out dx,al
Дальше там прыжок на определение размера срамы, оставил его, и сразу после этого вставляю свой говнокодес:
Код
serial_init:
mov ax,64 ; 19200 @40MHz
mov dx,0FF88h
out dx,al
mov ax,12 ; mode 1 asynchronous 8 N 1
mov dx,0FF80h
out dx,ax
forever:
mov al,'2'
call cout
jmp forever
; send 8-bit character in al to terminal
; entry: al
cout: push ax
mov dx,0FF82h
cout1: in al,dx
test al,40h; test TXE
jz cout1; wait until TXE = 1
pop ax
mov dx,0FF84h
out dx,al
ret
mov ax,64 ; 19200 @40MHz
mov dx,0FF88h
out dx,al
mov ax,12 ; mode 1 asynchronous 8 N 1
mov dx,0FF80h
out dx,ax
forever:
mov al,'2'
call cout
jmp forever
; send 8-bit character in al to terminal
; entry: al
cout: push ax
mov dx,0FF82h
cout1: in al,dx
test al,40h; test TXE
jz cout1; wait until TXE = 1
pop ax
mov dx,0FF84h
out dx,al
ret
Включаю - в терминале молчек. Смотрю в лог анализатор - на шине что-то молотит, но если сначала визуально идут разные команды, то спустя какое-то время визуально начинается повторяющийся паттерн - возможно крутит какой-то цикл, возможно мой цикл. Но в терминале - не але.
Руководствуюсь в основном вот этим документом: http://support.amd.com/TechDocs/19713.pdf
Вдруг кто работал с этими камнями: Достаточно ли для того, чтобы заработал UART сконфигурировать его так, как это сделал я, или нужно еще что-то где-то предварительно настроить? Мож ноги ему явно указать как-то надо, или не знаю, прерывания явно запретить? Можно ли как-то "пошагово" выполнять опкоды? Чтоб я хоть полностью шину данных мог посмотреть.
Спасибо.