...
...
Кое что уже делали ;)
вот ссылка
я в ковырял там большой кусок, особенно с conout
Viktor2312, ты меня извини..., но это больше похоже на изучение ассемблера для ВМ80. ;)
Посмотри 2-ой пост в этой теме -не пожалеешь, там esl давал ссылку на свои изыскания, он проделал очень большую работу. Практически всё разложено по полочкам: видна структура BOOTM и CONOUT.
В таблице 9.1 есть несколько ошибок, перепутаны адреса подпрограмм: "CONIN", "CONSTAT", ".AROMR".
Посмотри аттач к этому посту. :)
Viktor2312, не воспринимай так близко к сердцу, помочь хочется. :)
Посмотри это http://zx.pk.ru/attachment.php?attac...4&d=1295181617, esl выкладывал. Там листинги (ИДА не нужна), правда мнемоника Z80. Если подождёшь до завтра, конвертну в формат ВМ80 (софт на другом компьютере, не сподручно). Могу выложить то что сделал esl, в таком же варианте, думаю он не будет против :).
Очень хороший вариант для изучения это эмулятор b2m.
http://bashkiria-2m.narod.ru/
http://bashkiria-2m.narod.ru/files/emu.rar
В нём есть встроенный отладчик, очень хороший, можно всё смотреть как в живую. И память и регистры процессора. Попробуй. :)
---------- Post added at 01:16 ---------- Previous post was at 01:14 ----------
Да. В тех листингах о которых я упомянул это всё видно.
Вот именно, попробуй. А чтобы облегчить тебе задачу, расскажу, как я бы делал:
1. Запускаем эмулятор, выбираем "Иришу".
2. В меню выбираем View/Start debugger
3. Перемещаемся на адрес 0000 (нажать Ctrl+G, ввести в верхнее поле 0)
4. Ставим точку останова (нажать F9)
5. Запускаем прерванную эмуляции (нажать F5)
6. Нажать на тулбаре красную кнопку "Reset" (или нажать Ctrl+Break), снова появится отладчик, PC будет 0000, остальные регистры не изменились, но можно перейти туда клавишей Tab и установить нули. Таким образом получим ситуацию как после включения.
7. Нажимая клавишу F8 смотрим результат исполнения каждой команды.
В принципе, вместо пунктов 3-6 можно просто установить все регистры в ноль, включая и PC, получится то-же самое.
И никаких справочников не надо :)
В мнемонике ВМ80:
В мнемонике Z80:Код:ROM:006F _LDIR:
ROM:006F
ROM:006F 7E mov a, m
ROM:0070 12 stax d
ROM:0071 23 inx h
ROM:0072 13 inx d
ROM:0073 0B dcx b
ROM:0074 78 mov a, b
ROM:0075 B1 ora c
ROM:0076 C2 6F 00 jnz _LDIR
ROM:0079 C9 ret
Эта подпрограммка аналог команды пересылки LDIR микропроцессора Z80: загрузка с инкрементом до BC=0.Код:ROM:006F _LDIR:
ROM:006F
ROM:006F 7E ld a, (hl)
ROM:0070 12 ld (de), a
ROM:0071 23 inc hl
ROM:0072 13 inc de
ROM:0073 0B dec bc
ROM:0074 78 ld a, b
ROM:0075 B1 or c
ROM:0076 C2 6F 00 jp nz, _LDIR
ROM:0079 C9 ret
У ВМ80 её нет, поэтому есть эта подпрограмма. :)Цитата:
Действие команды подобно пересылке блока данных при ПДП. Как для
адресации, так и для счётчика байтов отведено по 16 бит, т.о. могут обрабатываться блоки любой
длины и в любом месте памяти. Блоки данных могут также перекрываться. При HL=DE команда
теряет смысл т.к. источник и приёмник идентичны. Следует обратить внимание, что при
обработке команды сначала пересылаются данные, только затем декрементируется ВС, и на
основании этого решается вопрос о цикличности команды, выполнять дальнейшую пересылку
данных либо прекратить команду. После выполнения команды BC=0.
Я так понял ты об этом фрагменте:
С адреса FF74h располагается "область сохранения текущего режима ASRAR" (16 байт) программы CONOUT. Здесь заносятся в эту область начальные значения, при инициализации системы. В HL загружаем адрес откуда переслать, в DE - куда, в BC - сколько байт.Код:ROM:024B 21 97 00 lxi h, 0097h
ROM:024E 01 10 00 lxi b, 10h
ROM:0251 11 74 FF lxi d, FF74h
ROM:0254 CD 6F 00 call _LDIR
Так и есть. Только это верно при включенной нулевой карте памяти.
По поводу BOOTM: для неё отведён диапазон адресов в ПЗУ 0000-1FFFh.
Опять же это верно для нулевой карты памяти. Она включается при старте компьютера, а так же когда необходимо обратиться к подпрограммам находящимся в ПЗУ модуля процессора. При включении других карт памяти, в этой области располагается ОЗУ. При выборе программы "МОНИТОР" в стартовом меню, включается первая карта. А в ней по адресам ниже 4000h располагается ОЗУ.
Ниже пара карт распределения памяти из МПСиС.
Эта попроще.
Её достаточно для запуска ПЭВМ в минимальной конфигурации. А так же для работы с МСИ.
Эта посложнее.
Именно эта карта необходима для взаимодействия МП с КНГМД.Цитата:
PC2,3
00 - ROM,RAM1,RAM2,VRAM
01 - RAM3,RAM1,RAM2,VRAM
10 - RAM3,RAM4,RAM2,RAM5
11 - RAM3,RAM6,RAM2,RAM7
А какими командами (или Esc-последовательностями) задаётся режим экрана для CONOUT? Через порты переключить несложно, но драйвер вывода об этом ведь не узнает.
В двух словах: это такая последовательность символов, начинается кодом 1Bh (код клавиши Esc), затем буква, означающая для драйвера консоли определённую функцию, ну и параметры могут быть, заканчивающиеся иногда символом ]. Есть стандарты, VT52, VT100, но могут быть и расширения, например для управления режимом экрана.
Судя по твоим скриншотам, ты уменьшил окно эмулятора. Выбери в меню 1:1, иначе изображение будет размыто, и разницы действительно не заметно.
Вся память адаптера дисплея физически находится во второй странице (P0=0, P1=1). Первая страница используется для доступа к ОЗУ КНГМД. Процессор же видит "своё адресноё пространство", через призму 155РЕ3. Об этом уже не раз говорилось. Причём для ЦП видео-ОЗУ находится по адресам C000h-FFFFh. :)
Ты на живой машине попробуй прочитать, это только в эмуляторе возможно. См. схему. ;)
Монохромный - это одноцветный: моно - один, хрома - цвет.
Прямым воздействием на контроллер дисплея через его регистры переключать режимы не совсем корректно. О текущем режиме должна ещё знать и программа, которая с ним работает. Это видно наглядно когда переключили в 3-ий режим и получили кракозябры на экране. Кстати, если обратили внимание, то работа фактически происходит с областью памяти 1-ой страници видео-ОЗУ режима 1. Это касаемо приведённых выше картинок.
b2m не зря говорил про ESC-последовательности.
Достаточно ручками включить 2-ой или 3-ий режим. Результат не заставит себя долго ждать. :)
P.S. Вопрос к b2m: мне кажется, или на самом деле с 3-им режимом не всё гладко? :)
Похоже, что таких нет, или я не разобрался. Скорее всего всё делается манипуляциями с "файлом управления программы CONOUT" (стр.92, последние два абзаца).
Хотя..., на стр.94 упоминаются некоторые эскейп-последовательности.
"esc"+"N" - запомнить содержимое активной части файла управления в области ASRAR.
"esc"+"O" - восстановить содержимое активной части файла управления по содержимому области ASRAR.
"esc"+"P"+(1 байт парам.) - управление цветом индикации.
"esc"+"Q"+(1 байт парам.) - управление режимом работы программы.
Та программа, которая работает с экраном. Она же не может работать с экраном параметры которого ей не известны.
Стр. 93 - там описаны эти самые последовательности.
Ни в коей мере, просто шутка. :) И кстати, можно оценить плюсы эмулятора. ;)
---------- Post added at 21:52 ---------- Previous post was at 21:45 ----------
Проверил, кое-что работает.:)
Нажимаем на клавиатуре "ESC"+"P"+"(любая клавиша)"
и меняем цвет фона и символов НА ХОДУ! ;)
---------- Post added at 22:16 ---------- Previous post was at 21:52 ----------
Последовательность "ESC"+"P"+... тоже отрабатывает.
Всё-таки, как мне кажется, мои подозрения про 3-ий режим оправдываются. :(
По поводу цветов: когда цвет букв чёрный, фон действительно должен быть белый, так что в книге опечаток нет. Про это я знаю, но пока никто не жаловался :) В остальном, я надеюсь, палитра соответствует описанию.
А что именно не нравится? Цвета, или смещение букв? То, что буквы после переключения в 3-тий режим не выровнены по левому краю связано с тем, что в этом режиме нет "дырки" между частями видеопамяти, соответствующей первой и второй страницам режима низкого разрешения.
Пока нет программ, которые используют все возможности видеоадаптера, и нет реального компьютера, с которым можно было бы сравнить картинку, рано говорить о каких-либо несоответствиях в эмуляторе. На мой взгляд, сейчас всё совпадает с описанием (кроме случая с чёрным цветом букв).
---------- Post added at 23:47 ---------- Previous post was at 23:42 ----------
Кстати, да, ESC+Q+N включает третий режим, подобрал методом тыка. Только почему-то снизу экран обрезан. И экран не очищается.
---------- Post added at 23:49 ---------- Previous post was at 23:47 ----------
ESC+Q+G - второй режим (4х цветный).
---------- Post added at 23:50 ---------- Previous post was at 23:49 ----------
ESC+Q+E - первый режим (стандарт)
---------- Post added at 23:55 ---------- Previous post was at 23:50 ----------
На разные буквы реагирует, в чём разница - пока не понятно.
---------- Post added at 23:58 ---------- Previous post was at 23:55 ----------
ESC+Q+D и ESC+Q+E выбирают разные страницы.
---------- Post added 14.11.2011 at 00:05 ---------- Previous post was 13.11.2011 at 23:58 ----------
Я понял, почему снизу обрезано - межстрочное расстояние меньше, а количество строк осталось то же (видимо, задаётся другими командами).
---------- Post added at 00:11 ---------- Previous post was at 00:05 ----------
Сведём воедино:
ESC+Q+A 320x200 страница 1 (E000-FFFF)
ESC+Q+B 640x200
ESC+Q+C 320x200 4 цвета (второй режим)
ESC+Q+D 320x200 страница 0 (C000-DFFF)
дальше повторяется до буквы P
ESC+Q+P выключить экран (вроде бы)
дальше то же
Уже разобрался. :) Заявка снимается. ;)
После этих последовательностей курсор странно мутирует. :)
По поводу подрезки экрана. Если после ESC+Q+N перейти в стандартный (первый режим), экран остаётся подрезанным. Чую есть ещё о чём подумать.
---------- Post added at 23:15 ---------- Previous post was at 23:11 ----------
Я когда экспериментировал поглядывал на соответствие между рисунками 9.13 (структура байта управления режимом вывода) и 9.12 (коды изображения символов знакогенератора).
---------- Post added at 23:21 ---------- Previous post was at 23:15 ----------
Т.е. получается, что
не при делах? :v2_conf2:
Короче, всё это описано в красной книжке, начиная со стр. 92.
ESC-последовательности там называются BSO-последовательностями (стр. 94)
---------- Post added at 00:28 ---------- Previous post was at 00:23 ----------
Всё там при делах, можно даже его менять командой SFF45. Вот только ESC+Q как-то странно его меняет. Я рассчитывал, что параметр просто пишется по адресу FF45, но похоже это не так.
Viktor2312, Сейчас объясню :)
---------- Post added at 22:35 ---------- Previous post was at 22:27 ----------
У Ириши нет текстового экрана
под текстовым я имею в виду экран в котором один байт в памяти отображает 1 байт на экране, это как текстовый режим при старте биоса на IBM
у Ириши есть ТОЛЬКО графические режимы
по этому биос должен "нарисовать" на экране символ который хочет напечатать пользователь
при этом где-то это или 40 или 80 байт в строку
или 1 или 2 бита на пиксель
чтоб не заводить кучу специальных функций для вывода в разные режимы есть только одна но универсальная
биос знает в каком режиме сейчас экран (т.к. он считает что кроме него переключить не может ни кто другой)
и в зависимости от этих знаний он и рисует символы на экране
поэтому когда Вы сменили режим экрана на другой через OUT биос уже не правильно отображает символы, т.к. он думает что все по старому а оно уже не соответсвует реальности
---------- Post added at 22:41 ---------- Previous post was at 22:35 ----------
ESC последовательности это управляющие последовательности при выводе строки
ESC это от название первого символа последовательности с кодом (ASCII decimal 27/hex 0x1B/octal 033)
вызываем функцию печати строки
и если в ней есть последовательность начинающаяся с ESC то делаем некие управляющие действия
в частности для ириши можно управлять режимом экрана
Управляющая последовательность ESC+Q+MODE
mode описан в 9.13
при переключении через последовательности биос ЗНАЕТ как надо скоректировать внутренние переменные и после такого переключения отображение символов происходит нормально
примеры
---------- Post added at 22:43 ---------- Previous post was at 22:41 ----------
эмулятор b2m -> reset
стартуем в первом режиме
можем поменять цвет
O7,D9 -> белые буквы на черном фоне
---------- Post added at 22:55 ---------- Previous post was at 22:43 ----------
заполняем экран -> D0
переключаемся в 3й режим
последовательно нажимаем ESC Q #
наблюдаем призабавную картинку
наш дамп превратился в кашу т.к. теперь старое содержимое экрана интрепретируется уже в соответсвии с другим режимом
ID8 -> 10001010 (0x8A)
заполняем экран -> D0
переключаемся в режим 2
ESC Q "
переключаем цвет на нормальный O2,D9
Id8 -> 10011010 (0x9a)
D0
после этого можно переключиться опять в режим 1
ESC Q !
и видно что в этом режиме строка занимает 40 байт а не 80 как во 2м и 3м (символы на экране через строку)
в общем все в порядке
---------- Post added at 23:17 ---------- Previous post was at 22:55 ----------
собственно вот обработчик ESQ-Q
т.е. перекодируем 0,1 битыКод:RAM:2612 __ESC_Q_CMD: ; DATA XREF: RAM:_ESC_Qo
RAM:2612 and 10h
RAM:2614 ld a, 0
RAM:2616 jp nz, loc_2627
RAM:2619 ld a, c
RAM:261A and 3
RAM:261C ld hl, unk_2630
RAM:261F ld e, a
RAM:2620 ld d, 0
RAM:2622 add hl, de
RAM:2623 ld a, 11101100b
RAM:2625 and c
RAM:2626 or (hl)
RAM:2627
RAM:2627 loc_2627: ; CODE XREF: RAM:2616j
RAM:2627 ld (_ConOut_Mode), a
RAM:262A call __RestoreDefConout
RAM:262D jp _ConOut_FixScreenVar
RAM:262D ; ---------------------------------------------------------------------------
RAM:2630 unk_2630: db 0 ; DATA XREF: RAM:261Co
RAM:2631 db 10h
RAM:2632 db 1
RAM:2633 db 2
вставлю в мнемонике i8080
Код:RAM:2612 __ESC_Q_CMD: ; DATA XREF: RAM:_ESC_Q_SetMODEo
RAM:2612 ani 10h
RAM:2614 mvi a, 0
RAM:2616 jnz loc_2627
RAM:2619 mov a, c
RAM:261A ani 3
RAM:261C lxi h, unk_2630
RAM:261F mov e, a
RAM:2620 mvi d, 0
RAM:2622 dad d
RAM:2623 mvi a, 11101100b
RAM:2625 ana c
RAM:2626 ora m
RAM:2627
RAM:2627 loc_2627: ; CODE XREF: RAM:2616j
RAM:2627 sta _ConOut_Mode
RAM:262A call __RestoreDefConout
RAM:262D jmp _ConOut_FixScreenVar
RAM:262D ; ---------------------------------------------------------------------------
RAM:2630 unk_2630: .db 0 ; DATA XREF: RAM:261Co
RAM:2631 .db 10h
RAM:2632 .db 1
RAM:2633 .db 2
esl, поясни, пожалуйста, а как быть с соответствием рисунку 9.13 символов: #, ", !. Что-то здесь не вяжется. :v2_conf2:
как это не вяжется
ну ошибка там одна точно есть
ESC Q ' ' (0x20 пробел) режим 1 0 страница
ESC Q ! (0x21 !) режим 1 1 страница
ESC Q " (0x22 ") режим 2
ESC Q # (0x23 #) режим 3
нас интересуют 2 младших бита
они и переключают режим
точно, исправил
в коде выше видно что ESQ Q "почти" напрямую копируется в MODE (FF45)
как в табличке 9.13
0X20 тут как раз от кода символа и по таблице "вкл динамич сдвиг маски"Код:ESC Q ' ' (0x20 пробел) режим 1 0 страница mode=0x20
ESC Q ! (0x21 !) режим 1 1 страница mode=0x30
ESC Q " (0x22 ") режим 2 mode=0x21
ESC Q # (0x23 #) режим 3 mode=0x22
оно нам не мешает ;)
ESC Q A - 0x41 - режим 1 1 страница mode
ну и т.д.
очередной баг в книге
параметр ESC Q не просто копируется в MODE
а
если стоит бит 0x10 (page)то копируем напрямую
иначе отдельно парсим 2 первых бита и уже модифицированное значение пишем в MODE
бит 40 отвечает за 20/25 строк на экране
читаем стр 90
в режиме 25 строк - символ 8 строк и курср инверсный симво и
в 20 символ 10 строу и курсор 2 нижних строки
все ок
почему не используем весь экран - не знаю, надо код дальше копать
сделай D0 в обеих режимах и увидишь разницу
похоже что высоту символов биос поменял а кол-во строк на экране забыл
на скриншотах подтверждение
Ctrl+L
Enter
D0
в ESQA остался хвост от ESQ! но влезло ровно столько же
Спасибо, пояснил. Я на промежуток между строками не обратил внимания. :)
---------- Post added at 02:32 ---------- Previous post was at 02:28 ----------
Интересно, что это за баг?
скорее всего баг
т.к. в книге этот режим называется 25 строк
сколько ж там похоже "багов", во всем :( :(
esl, скинул в соседней теме более свежую версию CONOUT. Этого бага в нём нет. :)
http://www.zx.pk.ru/showpost.php?p=430073&postcount=29
P.S. Надо бы сверить бинарник из эмулятора b2m с дампами из МПСиС и красной книги, может быть какие-нибудь ошибочки найдутся?
у меня с этим ромом не стартует эмулятор ...
заработало, похоже я криво ромы склеил :(
думаб что баг, таки
вот новый код
тут все прямо и понятноКод:RAM:24FA
RAM:24FA __ESC_Q_SetMODE: ; DATA XREF: RAM:_ESC_Q_SetMODEo
RAM:24FA ani 10h
RAM:24FC mvi a, 0
RAM:24FE jnz _1
RAM:2501 mov a, c
RAM:2502 ani 3
RAM:2504 lxi h, _FixModeBits
RAM:2507 mov e, a
RAM:2508 mvi d, 0
RAM:250A dad d
RAM:250B mvi a, 11101100b
RAM:250D ana c
RAM:250E ora m
RAM:250F
RAM:250F _1: ; CODE XREF: RAM:24FEj
RAM:250F sta _ConOut_Mode
RAM:2512 call sub_24BE
RAM:2515
RAM:2515 loc_2515: ; DATA XREF: RAM:2115o
RAM:2515 xra a
RAM:2516 sta _ConOut_WIN_Left
RAM:2519 sta _ConOut_WIN_Up
RAM:251C call _CO_GetWidth
RAM:251F sta _ConOut_WIN_Right
RAM:2522 call _CO_GetScreenLines
RAM:2525 sta _ConOut_WIN_Down
RAM:2528 ret
RAM:2528 ; ---------------------------------------------------------------------------
RAM:2529 _FixModeBits: .db 0 ; DATA XREF: RAM:2504o
RAM:252A .db 10h
RAM:252B .db 1
RAM:252C .db 2
RAM:252D
RAM:252D ; =============== S U B R O U T I N E =======================================
RAM:252D
RAM:252D
RAM:252D _CO_GetWidth: ; CODE XREF: RAM:2254p
RAM:252D ; RAM:251Cp
RAM:252D lda _ConOut_Mode
RAM:2530 ani 1
RAM:2532 mvi a, 40
RAM:2534 rz
RAM:2535 rlc
RAM:2536 ret
RAM:2536 ; End of function _CO_GetWidth
RAM:2536
RAM:2537
RAM:2537 ; =============== S U B R O U T I N E =======================================
RAM:2537
RAM:2537
RAM:2537 _CO_GetScreenLines: ; CODE XREF: RAM:2522p
RAM:2537 lda _ConOut_Mode
RAM:253A ani 1000000b
RAM:253C mvi a, 20
RAM:253E rz
RAM:253F mvi a, 25
RAM:2541 ret
RAM:2541 ; End of function _CO_GetScreenLines
RAM:2541
времени и желания не хватит ...
первый я частично разобрал, и выкладывал тут.
это абсолютно не важно, сам по себе регистр флагов мало интересен
он нужен ТОЛЬКО после выполнения операции
т.к. в нем будет установлен соответствующий флаг стоять
который мы дальше и проверим
и обычно после этой проверки нам он уже и опять не важен
для отдельных битов есть команды установки сброса
типа STC/CMC для С
z можно сбросить ORA A
где-то так.