Optron #21
27 ноября 1998

Кодинг - Тест доступной памяти. Управление банками памяти. Адаптация программ под Miko.

<b>Кодинг</b> - Тест доступной памяти. Управление банками памяти. Адаптация программ под Miko.
             
             
             
             

       Miko-Best: с STS'ом в руках

Иван Бугай, 1998

  В этой статье мы с вами, дорогие читате-
ли  "Оптрона",  вдохновясь  примером Жанны
Скальпив,  попробуем подробнее разобраться
с патогенным феноменом, известным под наз-
ванием "Miko-Best 256kB".  (Сразу же заме-
чу,  что "-Best" - это, скорее всего, тер-
минологическая  ошибка. Правильнее было бы
"Miko-Suxx". Иначе как объяснить отношение
производителей к своему детищу:  ни инфор-
мационной поддержки, ни программ.)
  Хотя  сей  феномен  уже  освещался  (см.
номера  7  и  8 "Оптрона"), вопрос требует
дополнительного изучения.


     Для начала - небольшое уточнение

  У меня имеется Miko-Best  256kB  v1.5  с
двумя доработками:
  - OUT (#FD),A - работает нормально  (ле-
чится  перешиванием  ПЗУ,  выполненного на
РТ4, сие делали на фирме Мiko);
  - рубильник   Miko-Pentagon  (сие  делал
Рашпиль, премного ему блaгoдарен).


       А теперь - малость демагогии
         (или мои предположения)

  ROM 64Kb, в нём:

              1 Мanager
              2 TR-DOS 5.03
              3 Basic 128
              4 Basic 48

  При начальном запуске или при сбросе уп-
равление  передаётся  Manager, блокируется 
Magic, опрашиваются клавиши "R" и "T".
  "R" - запуск полного теста памяти.
  "Т" - телетест:  тестируется  содержимое
#DB00  в  банке  #0D.  Если  оно  не равно
#АА55, то идет тест AY, Printer, Memory, и
при  его удачном завершении происходит вы-
ход в меню.
  В противном случае проверяется, нажат ли
пробел.  Если да, то Miko Basic (и 48-й, и
128-й) работает из ПЗУ.  Если не нажат, то
Miko Basic перегружается в ОЗУ - банк  #0C
для  128-го  и  #0E для 48-го. В эти банки
запрещается  запись,  и они проецируются с
адреса #0000.


          Перейдем ближе к делу

  Управление   ресурсами  компьютера  осу-
ществляется через порт #DC:
  - BIT  0-3 - номер проецируемой страницы
с адреса #8000;
  - BIT 4 - номер "линейки" из восьми бан-
ков, проецируемых с адреса #C000;
  - BIT 5 - если "0",  то вместо ПЗУ прое-
цируется ОЗУ - банк #0C или #0Е, в зависи-
мости от состояния четвёртого разряда пор-
та #FD ("1" - #0E, "0" - #0C);
  - BIT  6  -  если "0",  то запись в сег-
мент 0 разрешена (при условии, что сброшен
BIT 5);
  - BIT 7 - eсли "1", то, начиная с адреса
#4000, проецируется банк #0D, экран 0, а с
адреса #C000 - экран 1, банк #0F.
  Порт #FD  (есть  мнение,  что сего порта
нет в помине,  его  отслеживание  делается
аппаратно  и  он эмулируется портoм #FC) -
как в стандартном SPECCY 128.
  Порт #FC - эмулирует #FD с той разницей,
что BIT 5 (защелка 48K) может  переключать
режимы 48/128.
  Все три названных порта доступны как  на
запись, так и на чтение.


        Практическое применение

  Вот небольшой отрывок из Miko comander:

   LD  BC,#FFFC     ;порт-аналог #FD
   IN  H,(C)        ;сохранили текущее
   LD  A,#55        ;значение
   OUT (C),A
   IN  L,(C)        ;проверка, доступна
   CP  L            ;ли запись?
   JR  NZ,NO_MIKO
   OUT (C),H        ;восстановили
   LD  DE,768       ;доступно памяти
   IN  A,(#DC)      ;вместо ПЗУ ОЗУ?
   BIT 5,A
   JR  NZ,STANDART
   LD  DE,704       ;если да, то
   LD  A,#FF        ;исключить из списка
   LD  (TBANK+13),A ;доступных банков #0D
   BIT 5,H          ;включен Basic 128?
   JR  NZ,MODE_128
   LD  DE,640       ;если да - выкинуть
   LD  A,#FF        ;банк #0C
   LD  (TBANK+12),A

  Так  выглядит  тест  доступной памяти, а
управление банками происходит так:

   LD  HL,TBANK
   LD  E,A          ;в А виртуальный
   LD  D,0          ;номер страницы
   ADD HL,DE
   LD  A,(HL)
   CP  #FF          ;если не доступна -
   RET Z            ;выход
   LD  L,A
   AND #08          ;выделили третий бит
   RLCA             ;и преобразовали его в
   LD  H,A          ;номер "линейки",
   IN  A,(#DC)      ;который отправляется
   AND %11101111    ;в четвёртый разряд
   OR  H            ;порта #DC
   OUT (#DC),A
   LD  A,L
   AND #07
   LD  L,A
   IN  A,(#FC)
   AND %11111000    ;три младших разряда в
   OR  L            ;номере банка - в
   OUT (#FC),A      ;порт #FC (#FD)
   SCF
   RET
   ...

TBANK
   DB  0,1,3,4,6,7,8,9
   DB  #0A,#0B,#0F,#0C,#0E,#FF

  Банк #0D не используется,  поскольку там
Manager хранит 4 байта идентификатора  за-
пуска,  из-за чего теряется 16K (по-моему,
это делать нецелесообразно).
  "И что  же со всем этим делать?" - спро-
сите вы.
  Ну, если вы хотите адаптиравать програм-
му под Miko,  то всё  просто  (к  примеру,
HC_3.08 - лучший командер на Speccy,  даже
на сегодняшний день):

             ORG #6F0F
             PUSH  BC
             LD    B,A
             LD    A,(#5B75)
             EX    AF,AF'
             LD    A,(#5B90)
             ADD   A,A
             JR    C,PENT
             LD    A,B
             AND   #08
             RLCA
             OR    #62
             OUT   (#DC),A
PENT
             LD    A,B
             LD    (#5B75),A
             AND   #08
             RRCA
             RRCA
             RRCA
             LD    C,A
             LD    A,B
             AND   #07
             ADD   A,C
             OR    #10
             LD    BC,#7FFD
             OUT   (C),A
             EX    AF,AF'
             POP   BC
             RET

  В Option   надо   задать  User  page,  а
Autoload Оverlays - убрать (для 256K). Те-
перь вы имеете 160кБ без RAM-Disk.  На не-
которое  несоответствие информации относи-
тельно  Memory (программа сделана для, как
минимум, 512K) не обращайте внимания.
  Если  же  программа  сделана  под  порты
Scorpion'а, то это сделать ещё проще.
  А что делать с четырьмя экранами?
  Можно, например,  смотреть   триколорные
картинки:

             ORG   #7800
             LCODE "PICT"
             ORG   #6000
BEGIN
             DI
             LD    A,#17
             LD    HL,#7800
             LD    BC,#7FFD
             LD    DE,#C000
             OUT   (C),A
             PUSH  DE,BC
             LD    BC,6144
             LDIR
             PUSH  HL
             LD    HL,#D800
             INC   DE
             LD    BC,767
             LD    A,(COLOR2)
             LD    (HL),A
             LDIR
             POP   HL
             POP   BC,DE
             PUSH  DE,BC
             LD    A,#15
             OUT   (C),A
             LD    BC,6144
             LDIR
             PUSH  HL
             LD    HL,#D800
             INC   DE
             LD    BC,767
             LD    A,(COLOR4)
             LD    (HL),A
             LDIR
             POP   HL
             POP   BC,DE
             LD    A,#72
             OUT   (#DC),A
             LD    A,#17
             OUT   (C),A
             LD    BC,6144
             LDIR
             LD    HL,#D800
             INC   DE
             LD    BC,767
             LD    A,(COLOR1)
             LD    (HL),A
             LDIR
             LD    A,#62
             OUT   (C),A
             LD    HL,#BE00
             LD    DE,#BE01
             LD    A,H
             LD    (HL),#BF
             LD    I,A
             LD    BC,257
             LDIR
             LD    A,#C3
             LD    (#BFBF),A
             LD    HL,#8000
             LD    (#BFC0),HL
             EX    DE,HL
             LD    HL,INT
             LD    BC,COLOR1-INT
             LDIR
             IM    2
             EI
             LD    A,#15
             OUT   (#FD),A
MAIN         HALT
             CALL  8020
             JR    C,MAIN
EXIT         DI
             LD    A,#62
             OUT   (#DC),A
             LD    BC,#7FFD
             LD    A,60
             LD    I,A
             IM    1
             LD    A,#10
             OUT   (C),A
             EI
             RET
INT          DI
             PUSH  AF,BC,DE,HL,IX,IY
             EXX
             EX    AF,AF'
             PUSH  AF,BC,DE,HL
             LD    BC,#7FFD
             LD    HL,#151D
             LD    A,#62
             OUT   (#DC),A
             LD    A,0
WHO          EQU   #8000+$-1-INT
             OR    A
             JR    NZ,SK0
             INC   A
SK0          DEC   A
             JR    NZ,SK7
             OUT   (C),H
             INC   A
             JR    QEX
SK7          DEC   A
             JR    NZ,SK5F
             OUT   (C),L
             INC   A
             INC   A
             JR    QEX
SK5F         LD    A,#E2
             OUT   (#DC),A
             LD    A,#11
P1           DJNZ  $
             DEC   A
             JR    NZ,P1
             XOR A
             DEC A
QEX          INC   A
             LD    (WHO),A
             LD    A,#62
             OUT   (#DC),A
             POP   HL,DE,BC,AF
             EX    AF,AF'
             EXX
             POP   IY,IX,HL,DE,BC,AF
             EI
             RET
COLOR2       DEFB  #42
COLOR4       DEFB  #44
COLOR1       DEFB  #41

  Здесь и считать не надо: почти всё время
компьютера - в вашeй власти.  Сей  отрывок
взят из программы 3C-studio, которую я на-
писал ещё год назад (полноэкранный  редак-
тор триколорных картинок).  В принципе,  в
ней уже можно раскрашивать любые картинки.
Если кто-то изъявит желание, то я её допи-
шу.
  Кстати, такой  редактор можно написать и
для Speccy 128 (использовав одну треть эк-
рана  для  редактирования),  проблем здесь
нет.


               Перспектива

  Неплохо было бы сделать перехват Magic'а
или  Reset'а:  это вполне реально. При по-
ступлении  сигнала  NMI  вместо ПЗУ ТR-DOS
подставляем  страничку ОЗУ, а там выбираем
Magic, Debuger и т.п.
  Ещё хорошо бы в ПЗУ вместо Manager'а за-
шить свою программу.
  В общем,  нужен  программатор.  А  там -
попробуем, что получится.

              ──══════════──


        ──══ P.S. от Рашпиля ══──

  Конечно, заменить  малополезный  Manager
чем-то "более  другим"  заманчиво,  но  не
спешите,  уважаемые пользователи Miko: "Не
зная броду,  не суйся в воду".  Просто так
взять и зашить что-то в ПЗУ, предназначен-
ное для работы в Miko Best, не выйдет!
  Оказывается,  разработчики этого компью-
тера додумались перепутать шину данных ПЗУ
и процессора! Вот табличка, из которой яс-
но, что к чему:

     ROM          CPU

     D0 (11)      D2 (12)
     D1 (12)      D7 (13)
     D2 (13)      D0 (14)
     D3 (15)      D1 (15)
     D4 (16)      D5 (9)
     D5 (17)      D3 (8)
     D6 (18)      D4 (7)
     D7 (19)      D6 (10)

  В скобках  я указал номера выводов соот-
ветствующих микросхем.
  Как видно  из таблички,  просматривается
некая закономерность именно такого  распо-
ложения шин.  До такого, скорее всего, до-
думался какой-нибудь  нерадивый  разработ-
чик,  решивший  сэкономить пару переходных
отверстий,  пустив все дорожки паралельно.
Или,  может быть, это так "шифруют" инфор-
мацию?
  А в качестве замены Manager'а я бы посо-
ветовал  попробовать  прошивку  Gluk Reset
Service; ее можно заказать на Tree of Life
BBS.
  Если  же у Вас нет программатора, то для
прошивки ПЗУ можете обращаться к С.Филимо-
нову.  Его координаты, равно как и коорди-
наты  автора  этой  статьи  вы  найдёте на
страничке About.

              ──══════════──



Другие статьи номера:

ZX-Обоз - Обзор электронной прессы: Pilot 29, CNet Week 17, Born Dead 1-4, Maximum 47, Nicron 104.

Железо - Много функций на одном теле (об АОН'ах).

Железо - Обзор качества дискет.

Кодинг - Тест доступной памяти. Управление банками памяти. Адаптация программ под Miko.

Ликбез - Ассемблер: Взгляд издалека (продолжение).

Реклама - Реклама и объявления...

Четыре килобайта - О тематических выпусках Оптрона: Железо и кодинг.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Scene - интервью с Screamer'om взятое на CAFe'2002.
P.S. - Послесловие.
Чемпионат VIRUS II - Результаты финального сражения вирусов.
Презентация - Об ульяновской группе BANDIT GROUP.
Invite - Хочу предложить вам устроить небольшую party.

В этот день...   21 ноября