|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
PC-совместимый компьютер на К1810
Author |
Message |
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Это похоже, что он не до конца разобрал таблицу семисегментных сообщений этой ПЗУ: ---------------Но разбирать он её правильно начал: | | | | Code: DATA_0041 DW 0D0H ; Data table (indexed access) DB 06H, 01H, 25H, 01H, 3FH, 01H DB 7AH, 01H,0D7H, 01H,0E6H, 01H ... | | | | |
В общем-то Sourcer и никогда не создавал сразу полностью точного исходника.
За ним всегда надо пошустрить ручками. Как, впрочем, и в IDA - надо " пожить" в её среде,
правда, там автоматизированны характерные операции над кодом.
_________________ iLavr
|
10 Oct 2014 05:30 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Стал её разбирать вручную... и нифига не сходится...
Посмотрел схему - а 7-сегментные коды-то инверсные!
_________________ iLavr
|
10 Oct 2014 14:48 |
|
|
VGrad
Maniac
Joined: 18 Nov 2013 15:15 Posts: 209 Location: все оттуда ;)
|
Для Sourcer можно из бинарника собрать .com файл.
Положив в конец с E000 по FFFF сам бинарник ROM BIOS.
А для удобства по org 100h разместить jump 0FFF0h.
Только все длинные (far) вызовы придётся сделать руками учитывая сегменты.
|
10 Oct 2014 15:34 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Да они её еще и прошифровали зачем-то эту свою таблицу!
| | | | Code: ;==== External Entry into Subroutine ======================================
SUB_0023: LOC_0085: MOV SI,OFFSET DATA_0049 PUSH AX PUSH BX PUSH CX MOV AL,90H ; 100_10000 Запись в дисплейное ОЗУ OUT 0E6H,AL ; port 0E6H - КР580ВВ79 MOV BX,OFFSET DATA_0034 MOV CX,08H
LOCLOOP_0086: LODSB ; String [si] to AL MOV AH,AL ; AH <- AL AND AL,3FH ; 0011.1111b XLAT CS:[BX] ; al=[al+[bx]] table AND AH,80H ; 1000.0000b OR AL,AH OUT 0E4H,AL ; port 0E4H - КР580ВВ79 LOOP LOCLOOP_0086 ; Loop if cx > 0
POP CX POP BX POP AX RETN | | | | |
PS. Собственно, чего я добиваюсь, декомпилируя эту системную ПЗУ: ПЗУ BIOS от XT в сети имеются, а вот системной ПЗУ с Монитором для простой системы с 8086 у нас нет. Я хочу, чтобы у нас был рабочий образец, после чего я думаю выкинуть из схемы (и из программы) ВВ79 и заменить её ЖК индикатором. Заодно потом и всю схему упростить насколько возможно.
_________________ iLavr
|
10 Oct 2014 16:19 |
|
|
lbodnar
Novelist
Joined: 24 Dec 2004 13:58 Posts: 39 Location: UK
|
Здорово! Мне тоже стало интересно Попробую сегодня в IDA
|
11 Oct 2014 01:13 |
|
|
lbodnar
Novelist
Joined: 24 Dec 2004 13:58 Posts: 39 Location: UK
|
Они ее не пошифровали, просто старший бит пускается "в обход" таблицы. Скорее всего это десятичная точка. При этом таблица сокращается вдвое по размеру. Это только предположение - нужна проверка. Я ВВ79 только на бумажках видел.
|
11 Oct 2014 01:22 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Похоже, что Вы правы! Вчера уже спать хотелось неподецки, но AND AH,80H вроде как эту мысль
подтверждает.
А ВВ79 я тоже только на бумажках видел, но с год назад "теоретически" восполнил этот пробел.
Попалась в Интернете хорошая статья " Midi клавиатура на Z80", там ВВ79 используется, и довольно
подробно, но не так занудно, как в справочниках, описан принцип работы и примеры программирования.
Так что комменты про КР580ВВ79 я сразу посмотрел в своём дайджесте, который тогда сделал себе.
Нет - КР580ВВ79 хорошая БИС, освобождает проц от многих забот, но добавляет одну проблему -
раздобыть её саму, эту БИС... Ситуация примерно как с ВГ75 во времена "Радио - РК86"...
Кстати, КР580ВВ79 нет в справочнике Шахнова, и обычно опираются на её описание в журнале
МПСС 1988 ¹01: Кобылинский Д. В., Калатинец В. М., Заика Д. И. Программируемый контроллер клавиатуры и индикации КР580ВВ79, там подробно всё, но немного хаотично изложено.
Если Вы решили покопаться с этой прошивкой в IDA, думаю, вот эта таблица будет Вам полезна:
| | | | Code: Регистр упр-я УПР F8, FA, FC, FE ИБИС КР580ВВ79 ВК79 E4, E6 ИБИС КР580ВВ51А ВК51 E0, E2 ИБИС КР580ВИ53 ВК53 F0, F2, F4, F6 ИБИС КР580ВВ55А ВК55 D8, DA, DC, DE ОЗУ ОЗУСт, ОЗУМл 00000...00FFF ПЗУ ПЗУ FE000...FFFFF | | | | |
_________________ iLavr
|
11 Oct 2014 03:46 |
|
|
lbodnar
Novelist
Joined: 24 Dec 2004 13:58 Posts: 39 Location: UK
|
Спасибо, я на нее тоже уже смотрю - нашел в 7-м томе.
Вот таблица внутреннего представления символов. Жалко что они не использовали ASCII потому что трудно сообщения разбирать и некоторые символы вообще непонятны.
|
11 Oct 2014 04:17 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Да - можно было бы сделать перекодировку по таблице в 7-сегментный код.
Всё равно в ПЗУ куча нулей забита. Это не затормозило бы излишне программу.
Но проще для изучения, УМПК - всё ж учебная система.
_________________ iLavr
|
11 Oct 2014 04:52 |
|
|
lbodnar
Novelist
Joined: 24 Dec 2004 13:58 Posts: 39 Location: UK
|
Таблица системных сообщений.
Подпрограмма вывода сообщений находится по адресу cs:0703 и принимает номер сообщения в si.
Символ 0x40 обозначенный как "*" в сообщениях оставляет текущий отображаемый на дисплее символ неизменным. | | | | Code: segFE00:094D 40 40 40 40+ msg_table db 40h, 40h, 40h, 40h, 20h, 20h, 20h, 20h ; 0: "**** " segFE00:0955 0C 16 1A 2A+ db 0Ch, 16h, 1Ah, 2Ah, 1, 8, 1, 0 ; 1: "CPU-1810" segFE00:095D 2A 18 0E 0A+ db 2Ah, 18h, 0Eh, 0Ah, 0Dh, 1Bh, 2Ah, 20h ; 2: "-reaDy- " segFE00:0965 0D 12 18 20+ db 0Dh, 12h, 18h, 20h, 21h, 22h, 21h, 22h ; 3: "dir o°o°" segFE00:096D 18 0E 10 20+ db 18h, 0Eh, 10h, 20h, 22h, 21h, 22h, 21h ; 4: "rEG °o°o" segFE00:0975 05 0E 10 20+ db 5, 0Eh, 10h, 20h, 18h, 0Eh, 10h, 20h ; 5: "SEG rEG " segFE00:097D 0A 0D 18 20+ db 0Ah, 0Dh, 18h, 20h, 2Bh, 2Bh, 2Bh, 2Bh ; 6: "Adr ____" segFE00:0985 2A 05 19 0A+ db 2Ah, 5, 19h, 0Ah, 18h, 19h, 2Ah, 20h ; 7: "-StArt- " segFE00:098D 2A 0C 1B 0C+ db 2Ah, 0Ch, 1Bh, 0Ch, 14h, 0Eh, 2Ah, 20h ; 8: "-CYCLE- " segFE00:0995 0E 18 18 21+ db 0Eh, 18h, 18h, 21h, 18h, 20h, 40h, 40h ; 9: "Error __" segFE00:099D 05 19 21 16+ db 5, 19h, 21h, 16h, 40h, 40h, 40h, 40h ; 10: "Stop____" segFE00:09A5 20 0A 19 20+ db 20h, 0Ah, 19h, 20h, 40h, 40h, 40h, 40h ; 11: " At ____" segFE00:09AD 05 18 0C 20+ db 5, 18h, 0Ch, 20h, 40h, 40h, 40h, 40h ; 12: "SrC ____" segFE00:09B5 0D 05 19 20+ db 0Dh, 5, 19h, 20h, 2Bh, 2Bh, 2Bh, 2Bh ; 13: "DSt ____" segFE00:09BD 14 0E 23 10+ db 14h, 0Eh, 23h, 10h, 2Bh, 2Bh, 2Bh, 2Bh ; 14: "LEnG____" segFE00:09C5 40 40 40 2A+ db 40h, 40h, 40h, 2Ah, 2Bh, 2Bh, 2Bh, 2Bh ; 15: "***-____" segFE00:09CD 14 00 0A 0D+ db 14h, 0, 0Ah, 0Dh, 20h, 20h, 0, 0 ; 16: "LOAD 00" segFE00:09D5 0E 18 18 20+ db 0Eh, 18h, 18h, 20h, 14h, 0, 0Ah, 0Dh ; 17: "Err LOAD" segFE00:09DD 23 21 19 20+ db 23h, 21h, 19h, 20h, 0Eh, 17h, 1Ah, 20h ; 18: "not EqU " segFE00:09E5 0E 17 1A 0A+ db 0Eh, 17h, 1Ah, 0Ah, 14h, 20h, 20h, 20h ; 19: "EqUAL " | | | | |
|
11 Oct 2014 05:11 |
|
|
lbodnar
Novelist
Joined: 24 Dec 2004 13:58 Posts: 39 Location: UK
|
К сожалению в мониторе есть откровенно странные места. Например вблизи FE00:00EF откуда ни возьмись ввод из порта, потом зачем-то префикс CS: (db 2Eh) и затем push es за которым не следует соответствующий pop.
В FE00:0362 вообще происходит jmp прямо в середину другого оpcode.
Есть еще несколько таких же странных мест.
Я сверил эти места с распечаткой и они совпадают безупречно. Видимо или ошибка при наборе была или в процессе передачи в печать или плавающие биты в ПЗУ. Или одно из двух.
|
11 Oct 2014 14:20 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Да - я тоже с этим столкнулся... поэтому пока и молчал.
В таких случаях я далее пытаюсь угадать, что тут было бы необходимо по логике программы.
В принципе же jmp прямо в середину другого оpcode для этого процессора - не запрещенный прием!
Поэтому размышляю пока - баги это или фичи. И всё ли я сам сделал до конца верно в процессе декомпиляции.
_________________ iLavr
|
11 Oct 2014 14:53 |
|
|
lbodnar
Novelist
Joined: 24 Dec 2004 13:58 Posts: 39 Location: UK
|
Вот такой вот баготрон. Ну тут я, кажется, додумал что должно быть. 8086 машинный код я знаю плохо поэтому много комментариев.
| | | | Code: segFE00:00D0 ; ==== S U B R O U T I N E ==== segFE00:00D0 segFE00:00D0 ; al = char to add to scrolling display segFE00:00D0 ; 41h pads the scrolling text with blanks segFE00:00D0 segFE00:00D0 scroll_display_data_area proc near ; segFE00:00D0 B9 03 00 mov cx, 3 ; move 3 chars from "ABCD1234" to "ABCD234 " segFE00:00D3 3C 41 cmp al, 41h ; pad with blanks ? segFE00:00D5 90 nop ; segFE00:00D6 90 nop ; segFE00:00D7 74 19 jz clear_last_position ; yes segFE00:00D9 segFE00:00D9 C6 06 E0 0E+ mov flag_1, 0FFh segFE00:00DE 50 push ax segFE00:00DF BE A5 0E mov si, (offset DisplayBuffer+5) segFE00:00E2 BF A4 0E mov di, (offset DisplayBuffer+4) segFE00:00E5 segFE00:00E5 move_chars_left: ; segFE00:00E5 AC lodsb ; load display char segFE00:00E6 24 7F and al, 7Fh ; suppress decimal point segFE00:00E8 AA stosb ; store to the position on the left segFE00:00E9 E2 FA loop move_chars_left ; Loop while CX != 0 segFE00:00EB segFE00:00EB 58 pop ax ; char to add to the last position segFE00:00EC 0C 80 or al, 80h ; set decimal point segFE00:00EE AA stosb ; store in the buffer[7] segFE00:00EF ; >>>> bug, two corrupted bytes ED 2E should be E9 1A <<<<< segFE00:00EF ED in ax, dx ; should be E9 1A 06: jmp update_display segFE00:00F0 db 2Eh ; 062E would be inside another opcode segFE00:00F0 2E 06 push es segFE00:00F2 segFE00:00F2 clear_last_position: ; segFE00:00F2 BE A6 0E mov si, (offset DisplayBuffer+6) segFE00:00F5 BF A7 0E mov di, (offset DisplayBuffer+7) segFE00:00F8 80 0C 80 or byte ptr [si], 80h ; set decimal point in next to last position segFE00:00FB FD std ; direction is down segFE00:00FC F3 A4 rep movsb ; shift display: "ABCD1234" to "ABCD234 " segFE00:00FE B0 20 mov al, 20h ; blank segFE00:0100 90 nop ; segFE00:0101 AA stosb ; last char is blank segFE00:0102 FC cld ; restoredirection to up segFE00:0103 E9 1A 06 jmp update_display ; convert LED buffer to 7-seg data and send to display segFE00:0103 scroll_display_data_area endp | | | | |
|
11 Oct 2014 15:07 |
|
|
lbodnar
Novelist
Joined: 24 Dec 2004 13:58 Posts: 39 Location: UK
|
Возникает вопрос сколько там есть неочевидных ошибок типа mov ax, bx вместо mov ax, dx? Придется буквально каждый байт проверять. Не зря она называется Учебная МикроЭВМ
|
11 Oct 2014 15:20 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
А я пока раздумываю над логикой программы обычно сам задумчиво комментирую листинг... А то так - оторвет что-либо от программы, потом забудешь и вспоминай по-новой.
Ну так запускать всё-равно под "Proteus"-ом. Хорошо, что знаем теперь про ошибки!
А то - занесли бы в ПЗУ, а она (МикроЭВМ) и не работает. Из доверия к книгам пинали бы схему!
Кстати говоря, обратил внимание вот на какую вещь: ПЗУ-то в схеме полностью 16-разрядное - К573РФ3.
Мы в связи с этим нигде не ошибаемся при декомпиляции?
Я обратил внимание в тексте много выравниваний на слово вроде как присутствует...
_________________ iLavr
|
11 Oct 2014 16:01 |
|
|
Who is online |
Users browsing this forum: No registered users and 9 guests |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum
|
|