nedoPC.org

Community of electronics hobbyists established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 22 May 2022 22:48



Reply to topic  [ 188 posts ]  Go to page Previous  1, 2, 3, 4, 5, 6, 7, 8 ... 13  Next
PC-совместимый компьютер на К1810 
Author Message
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Stan wrote:
...он еще и внешние метки выкатывает те, которые, по идее, должны быть явно в теле ПЗУ:
Code:
; The following equates show data references outside the range of the program.

DATA_0004E      EQU     0EA0H                   ;*
DATA_0005E      EQU     0EA4H                   ;*
...
DATA_0026E      EQU     0EECH                   ;*


Это похоже, что он не до конца разобрал таблицу семисегментных сообщений этой ПЗУ:

---------------

Но разбирать он её правильно начал:
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 06:30
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Lavr wrote:
Это похоже, что он не до конца разобрал таблицу семисегментных сообщений этой ПЗУ...

Стал её разбирать вручную... и нифига не сходится... :(

Посмотрел схему - а 7-сегментные коды-то инверсные! :wink:

Image

_________________
iLavr


10 Oct 2014 15:48
Profile
Maniac

Joined: 18 Nov 2013 16:15
Posts: 207
Location: все оттуда ;)
Reply with quote
Post 
Для Sourcer можно из бинарника собрать .com файл.
Положив в конец с E000 по FFFF сам бинарник ROM BIOS.
А для удобства по org 100h разместить jump 0FFF0h.
Только все длинные (far) вызовы придётся сделать руками учитывая сегменты.


10 Oct 2014 16:34
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Lavr wrote:
Стал её разбирать вручную... и нифига не сходится... :(
Посмотрел схему - а 7-сегментные коды-то инверсные! :wink:

Да они её еще и прошифровали зачем-то эту свою таблицу! :o
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 17:19
Profile
Novelist

Joined: 24 Dec 2004 14:58
Posts: 39
Location: UK
Reply with quote
Post 
Здорово! Мне тоже стало интересно :) Попробую сегодня в IDA


11 Oct 2014 02:13
Profile
Novelist

Joined: 24 Dec 2004 14:58
Posts: 39
Location: UK
Reply with quote
Post 
Lavr wrote:
Да они её еще и прошифровали зачем-то эту свою таблицу! :o


Они ее не пошифровали, просто старший бит пускается "в обход" таблицы. Скорее всего это десятичная точка. При этом таблица сокращается вдвое по размеру. Это только предположение - нужна проверка. Я ВВ79 только на бумажках видел.


11 Oct 2014 02:22
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Post 
lbodnar wrote:
Скорее всего это десятичная точка. При этом таблица сокращается вдвое по размеру. Это только предположение -
нужна проверка. Я ВВ79 только на бумажках видел.

Похоже, что Вы правы! Вчера уже спать хотелось неподецки, но AND AH,80H вроде как эту мысль
подтверждает.

А ВВ79 я тоже только на бумажках видел, но с год назад "теоретически" восполнил этот пробел.
Попалась в Интернете хорошая статья "Midi клавиатура на Z80", там ВВ79 используется, и довольно
подробно, но не так занудно, как в справочниках, описан принцип работы и примеры программирования.
Так что комменты про КР580ВВ79 я сразу посмотрел в своём дайджесте, который тогда сделал себе.

Нет - КР580ВВ79 хорошая БИС, освобождает проц от многих забот, но добавляет одну проблему -
раздобыть её саму, эту БИС... :wink: Ситуация примерно как с ВГ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 04:46
Profile
Novelist

Joined: 24 Dec 2004 14:58
Posts: 39
Location: UK
Reply with quote
Post 
Lavr wrote:
Если Вы решили покопаться с этой прошивкой в IDA, думаю, вот эта таблица будет Вам полезна:

Спасибо, я на нее тоже уже смотрю - нашел в 7-м томе. 8)

Вот таблица внутреннего представления символов. Жалко что они не использовали ASCII потому что трудно сообщения разбирать и некоторые символы вообще непонятны.

Code:
segFE00:0744 3F          LED_xlat_tbl    db 111111b              ; 0x00 0
segFE00:0745 06                          db 110b                 ; 0x01 1
segFE00:0746 5B                          db 1011011b             ; 0x02 2
segFE00:0747 4F                          db 1001111b             ; 0x03 3
segFE00:0748 66                          db 1100110b             ; 0x04 4
segFE00:0749 6D                          db 1101101b             ; 0x05 5
segFE00:074A 7D                          db 1111101b             ; 0x06 6
segFE00:074B 07                          db 111b                 ; 0x07 7
segFE00:074C 7F                          db 1111111b             ; 0x08 8
segFE00:074D 6F                          db 1101111b             ; 0x09 9
segFE00:074E 77                          db 1110111b             ; 0x0A A
segFE00:074F 7C                          db 1111100b             ; 0x0B b
segFE00:0750 39                          db 111001b              ; 0x0C C
segFE00:0751 5E                          db 1011110b             ; 0x0D d
segFE00:0752 79                          db 1111001b             ; 0x0E E
segFE00:0753 71                          db 1110001b             ; 0x0F F
segFE00:0754 3D                          db 111101b              ; 0x10 G
segFE00:0755 76                          db 1110110b             ; 0x11 H
segFE00:0756 04                          db 100b                 ; 0x12 i
segFE00:0757 1E                          db 11110b               ; 0x13 J
segFE00:0758 38                          db 111000b              ; 0x14 L
segFE00:0759 72                          db 1110010b             ; 0x15 |-' maybe with decimal point == M ?
segFE00:075A 73                          db 1110011b             ; 0x16 p
segFE00:075B 67                          db 1100111b             ; 0x17 q
segFE00:075C 50                          db 1010000b             ; 0x18 r
segFE00:075D 78                          db 1111000b             ; 0x19 t
segFE00:075E 3E                          db 111110b              ; 0x1A U
segFE00:075F 6E                          db 1101110b             ; 0x1B Y
segFE00:0760 31                          db 110001b              ; 0x1C Г russian G
segFE00:0761 5F                          db 1011111b             ; 0x1D Б russian B
segFE00:0762 37                          db 110111b              ; 0x1E П russian P
segFE00:0763 53                          db 1010011b             ; 0x1F question mark ?
segFE00:0764 00                          db 0                    ; 0x20 space
segFE00:0765 5C                          db 1011100b             ; 0x21 o
segFE00:0766 63                          db 1100011b             ; 0x22 upshifted o (degree)
segFE00:0767 54                          db 1010100b             ; 0x23 n
segFE00:0768 23                          db 100011b              ; 0x24 upshifted n
segFE00:0769 1C                          db 11100b               ; 0x25 u
segFE00:076A 4C                          db 1001100b             ; 0x26 inverted c
segFE00:076B 58                          db 1011000b             ; 0x27 c
segFE00:076C 0F                          db 1111b                ; 0x28 ]
segFE00:076D 01                          db 1                    ; 0x29 ^
segFE00:076E 40                          db 1000000b             ; 0x2A minus -
segFE00:076F 08                          db 1000b                ; 0x2B underscore _
segFE00:0770 48                          db 1001000b             ; 0x2C equal sign =
segFE00:0771 49                          db 1001001b             ; 0x2D three horisontal lines
segFE00:0772 20                          db 100000b              ; 0x2E top left `
segFE00:0773 02                          db 10b                  ; 0x2F top right '
segFE00:0774 64                          db 1100100b             ; 0x30 \
segFE00:0775 52                          db 1010010b             ; 0x31 /
segFE00:0776 74                          db 1110100b             ; 0x32 h
segFE00:0777 62                          db 1100010b             ; 0x33 upshifted u
segFE00:0778 00                          db 0                    ; 0x34
...
segFE00:0783 00                          db 0                    ; 0x3F


11 Oct 2014 05:17
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Post 
lbodnar wrote:
Жалко что они не использовали ASCII потому что трудно сообщения разбирать
и некоторые символы вообще непонятны.

Да - можно было бы сделать перекодировку по таблице в 7-сегментный код.
Всё равно в ПЗУ куча нулей забита. Это не затормозило бы излишне программу.
Но проще для изучения, УМПК - всё ж учебная система.

_________________
iLavr


11 Oct 2014 05:52
Profile
Novelist

Joined: 24 Dec 2004 14:58
Posts: 39
Location: UK
Reply with quote
Post 
Таблица системных сообщений.
Подпрограмма вывода сообщений находится по адресу 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 06:11
Profile
Novelist

Joined: 24 Dec 2004 14:58
Posts: 39
Location: UK
Reply with quote
Post 
К сожалению в мониторе есть откровенно странные места. Например вблизи FE00:00EF откуда ни возьмись ввод из порта, потом зачем-то префикс CS: (db 2Eh) и затем push es за которым не следует соответствующий pop.

В FE00:0362 вообще происходит jmp прямо в середину другого оpcode.

Есть еще несколько таких же странных мест.

Я сверил эти места с распечаткой и они совпадают безупречно. Видимо или ошибка при наборе была или в процессе передачи в печать или плавающие биты в ПЗУ. Или одно из двух.


11 Oct 2014 15:20
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Post 
lbodnar wrote:
К сожалению в мониторе есть откровенно странные места.
...

Да - я тоже с этим столкнулся... :( поэтому пока и молчал. :-?
В таких случаях я далее пытаюсь угадать, что тут было бы необходимо по логике программы.

В принципе же jmp прямо в середину другого оpcode для этого процессора - не запрещенный прием!

Поэтому размышляю пока - баги это или фичи. И всё ли я сам сделал до конца верно в процессе декомпиляции.

_________________
iLavr


11 Oct 2014 15:53
Profile
Novelist

Joined: 24 Dec 2004 14:58
Posts: 39
Location: UK
Reply with quote
Post 
Вот такой вот баготрон. Ну тут я, кажется, додумал что должно быть. 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 16:07
Profile
Novelist

Joined: 24 Dec 2004 14:58
Posts: 39
Location: UK
Reply with quote
Post 
Возникает вопрос сколько там есть неочевидных ошибок типа mov ax, bx вместо mov ax, dx? Придется буквально каждый байт проверять. Не зря она называется Учебная МикроЭВМ :D


11 Oct 2014 16:20
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Post 
lbodnar wrote:
8086 машинный код я знаю плохо поэтому много комментариев.

А я пока раздумываю над логикой программы обычно сам задумчиво комментирую листинг...
А то так - оторвет что-либо от программы, потом забудешь и вспоминай по-новой.

lbodnar wrote:
Придется буквально каждый байт проверять. Не зря она называется Учебная МикроЭВМ

Ну так запускать всё-равно под "Proteus"-ом. Хорошо, что знаем теперь про ошибки!
А то - занесли бы в ПЗУ, а она (МикроЭВМ) и не работает. Из доверия к книгам пинали бы схему! 8)


Кстати говоря, обратил внимание вот на какую вещь: ПЗУ-то в схеме полностью 16-разрядное - К573РФ3.
Мы в связи с этим нигде не ошибаемся при декомпиляции?
Я обратил внимание в тексте много выравниваний на слово вроде как присутствует... :-?

_________________
iLavr


11 Oct 2014 17:01
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 188 posts ]  Go to page Previous  1, 2, 3, 4, 5, 6, 7, 8 ... 13  Next

Who is online

Users browsing this forum: No registered users and 2 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

Search for:
Jump to:  

Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.