В предыдущей главе я описал железную часть моего контроллера SD карты для ПЭВМ «Микроша». А эта глава вышла программно-философской. Кому интересно — добро пожаловать!


Запись ПЗУ

Как я писал в предыдущей части, у меня старенький программатор ПЗУ под LPT. Связываться с эмуляцией LPT мне не хотелось, кроме того пришлось бы разбираться как работает программатор, как он управляется, все его команды и временные задержки.

Тогда я позвонил своему брату, который является сотрудником коммунальных служб и работает. Я попросил его заехать ко мне на работу и забрать там мой первый ноутбук IBM ThinkPad 760ed. И на следующий день бук был у меня.


Однако прошивать я еще был не готов. Мне нужно было поменять все адреса с 6xxx на Fxxx, где xxx — 12 бит адреса прошивки. Это было нужно из-за архитектуры процессора КР580ВМ80А, его система команд не предполагает переноса кода из одной области памяти в другую, что вызывает некоторые трудности.
Кстати, из-за этого у меня ушло много времени на общую правку прошивки, поскольку в результате низкоуровневой оптимизации кода, между подпрограммами стали образовываться «дырки». Размер этих не используемых участков порой доходил до 10 байт, и такое расточительство я себе позволить не мог. Приходилось сдвигать стыки и убеждаться, что код «не съехал» по вызовам и переходам.

В конечном итоге, я собрал минимально жизнеспособную прошивку. Это еще сырой вариант, который может нормально загружать положенный код в доп.ОЗУ и передавать управление. Сырость же прошивки заключается в том, что пока я не придумал хорошей оптимизации и удобного устройства того функционала, который я называю «мосты». Этот функционал нужен для полного использования всей дополнительной ОЗУ. Но я запутался в работе со стеком наловил много глюков и решил оставить проблему на потом, а пока использовать только 4 кБ новой ОЗУ, для начала должно хватить. А после можно будет дописать этот функционал, когда уже станет видно какие требования нужны для Операционной Системы. И еще, помимо места оставленного под «мосты», у меня оказалось около 600 байт свободного пространства.

Все свободное место я заполнил байтами 0xFF, это позволит в дальнейшем «дошить» в ПЗУ новые блоки не стирая всю память ультрафиолетовым излучением. Дело в том, что эти «EPROMы» устроены так, что прошивка заключается в изменении 1 в бите на 0. Таким образом 0xFF можно превратить в любой код. Кроме того, после пары ключевых переходов «JMP» я оставил по 3 кода 0xFF. Это позволит превратить сами коды «JMP» в 0x00 (NOP) и переход будет отменен, но поставить другой переход после него, сделав его из этих трех 0xFF.

Далее мне потребовалось питание 12 в. Сначала я хотел подключиться к БП Микроши, но потом увидел скрутку посредине кабеля питания ThinkPad`а. Помню как появилась эта скрутка, этот бук запитывался от автомобиля, для чиптюнинга всяких «Январей» и «Бошей», когда появились первые инжекторные «зубилы».
Раскрутив скрутку, я примотал туда кабель с разъемом «DJK-11b» и на программаторе весело зажегся красный светодиод.

После включения ноутбука я увидел следующее:

При этом раз в секунду раздавалось «дззззз-КЛАЦ!!!».
Да! Это означало, что HDD в ноутбуке не работает. Печалился я 10-15 минут, а потом понял, что еще не все потеряно, и что на этом «ThinkPad`е» имеется CD-ROM. Порывшись в барахле, я нашел 3 болванки DVD, но мне то нужно CD!

Тогда я снова позвонил брату и попросил купить а Ашане 3 болванки «CD-R». Описывать здесь создание CD диска с MS-DOS 6.22, полагаю смысла нет, добавлю только, что помимо MS-DOS я поместил на болванку программу для шитья «PGM02101» (она как раз под дос), саму прошивку в виде файла «ROM_V1.BIN» и «Norton Commander» версии 5.0.

Итак, дубль два. После включения бука, засовываю болванку в CD-ROM, и нажимаю «F1». На CD-ROM зажигается желтый светодиод и я слышу «ква-ква-ква-ква-пык!», потом пауза и снова «ква-ква-ква-ква-пык!». Так происходит раз двадцать, а потом появляется загадочная надпись:


Скорее всего это означает, что и «сидюк» тоже загнулся.

Далее выхода не было, кроме как разбирать привод CD-ROM. В нем оказалось куча пыли и еще непонятного мне черного порошка, откуда он там взялся, мне было неясно, тем более, что с момента последнего использования этого бука прошло не менее пяти лет и все это время он лежал на полке, в целлофане. Тогда я решил, что это «тангриз», и смело вычистил его из привода. Кроме того немного смазал литолом направляющие головки, и протер линзу ватной «ушной» палочкой со спиртом.

Это помогло, привод помигал, поквакал и я увидел на экране приглашение DOS. УРА!
«Norton» так и не запустился, возникала ошибка «Disk error reading (or writing) drive A:». Я подумал, что он что-то записывает для своих целей, а на CD-ROM записать не удавалось. Ну и черт с ним, я теперь вообще понять не могу, зачем он мне был нужен.
В общем «DIR», а потом «pgm02101.exe» и вот уже на экране долгожданная программа PGM02 предлагает выбрать LPT порт. Выбираем LPT 1 (0x378).

Для прошивки К573РФ5 требуется дополнительный источник питания +25в. Блок с таким напряжением мне посчастливилось найти. У меня есть принтер HP Deskjet 2050a, вот он и питается от БП с напряжением 30в. Благо, что у меня был мультиметр и удалось легко выяснить полярность на разъеме.

После процесса прошивки выяснилось, что прошивка не проходит. То есть процесс заканчивается, но в микросхеме ПЗУ по-прежнему читается 0xFF по всем адресам. Метод тыка мультиметром в панельку показал, что отсутствует напряжение программирования на выводе PGM. Оказалось, в программаторе «полетел» транзистор VT17 (КТ815Г), и мне пришлось его поменять.

Прошилось! И прочиталось правильно!

Неожиданный отказ ноги

Когда микросхема ПЗУ встала в контроллер, мне захотелось проверить ее читаемость. Я хотел использовать Системный Монитор и вывести область 0xF000-0xF7FF на экран с помощью директивы «D». Я нажал «DF0»… При нажатии «0» ничего не происходило, клавиша не работала.
Тогда я набрал «DEFFF,F7FF» и после нажатия «ВК» увидел на экране желаемое. Но для запуска загрузки с SD карты требовалось ввести «GF000» и нажать «ВК».

Сначала я думал, что дело в контактах, но как оказалось не работает еще ряд клавиш. Это были клавиши «8»,«пробел»,«Ю»,«Х»,«П»,«Ь» и стрелка вверх.
Открыв схему я увидел, что это первый вертикальный столбец клавиш. За этот столбец отвечал вывод PB0 микросхемы D39 (КР580ВВ55). Кстати в схеме для развязки столбцов указаны диоды, а по факту установлены резисторы номиналом 300 Ом.


Что это? Халтура производителя?
При ремонте заменю эти резисторы на диоды. Но как мне опробовать контроллер?

Новая надежда

Пришлось снова разворачивать ThinkPad и программатор с блоками питания. По адресам 0xF7CE — 0xF7D0 я «дошил» коды 0xC3, 0x00, 0xF0; что означает JMP F000.

Теперь запуск возможен не только командой «GF000», но и «GF7CE», где не учавствуют нерабочие клавиши. После запуска все удалось, и вместо OS загрузилась программка, которая вывела «MIKROSHA OS» на экран.

Ремонт сейчас я проводить не могу, но в Микроше микросхем КР580ВВ55 две штуки, и вторая практически не используется. Есть идея поменять их местами, а потом уже заменить неисправную. Поэтому я в третий раз позвонил брату, и попросил привезти мне оловоотсос, флюс «ЛТИ-120», припой и… еще одну Микрошу.

Да-да, Микроша у меня не одна, и та, которую он привез является чуть ли не музейным образцом «в масле». Дело все в том, что когда мой отец покупал мне Микрошу, то его попросили купить еще одну, и он купил. Но что-то пошло не так, и человек по какой-то причине отказался брать.
Так она и пролежала 30 лет.


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



Надо будет аккуратно и в этой поменять резисторы на диоды.
А пока я ей попользуюсь для того, чтобы закончить этот проект. Да, есть еще и третья Микроша, но о ней я расскажу как-нибудь в другой раз. Скажу только, что она сильно изуродована одним моим одноклассником «в те времена» и я ее потихоньку восстанавливаю, но она будет не аутентичной, а наоборот модифицирована до сверхвозможностей, и уже с применением микроконтроллеров и CPLD. Это будет другой проект.

Листинги и коды


Код
:20000000CDD0F0FE00CA1AF021D5F4CD18F8C39DF821E9F4CD18F8C39DF821FAEF977723F4
:20002000772377237711F5EF123EE01B12CD2FF4FE00C208F03A00E0FEEBCA69F03AFFE1DB
:20004000FEAAC211F001C6E111FDEF0A12031B0A12031B0A12031B0A12CD2FF4FE00C2080E
:20006000F03A00E0FEEBC211F03AFFE1FEAAC211F001CEF411BBE1CDDBF7FE00C211F00174
:20008000FAEF1A0213031A0213031A0213031A02CD2FF4FE00C208F006063AF4EF3C3C324A
:2000A000F4EFCDB9F0C5CD2FF4C1FE00C208F005C29AF0C300E0FFFFFF21FDEF7E3C77FE8C
:2000C00000C2CBF02B7DFEF9C2BCF0C9000000001E20CD87F5FE01CAE1F01DC2D2F03EE0ED
:2000E000C9CDC8F51E60CD00F5FE00CAF5F01DC2E6F03EE1C91E20CD50F5FE00CA06F11DF7
:20010000C2F7F03EE2C97A32FEEF97C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68
:20012000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF
:20014000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF
:20016000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F
:20018000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F
:2001A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F
:2001C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F
:2001E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F
:20020000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE
:20022000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE
:20024000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE
:20026000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E
:20028000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E
:2002A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E
:2002C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E
:2002E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E
:20030000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD
:20032000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD
:20034000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD
:20036000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D
:20038000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D
:2003A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D
:2003C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D
:2003E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D
:20040000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC
:20042000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3AFEEFE640FE40C259F43E51CD00F63AFAAB
:20044000EFCD00F63AFBEFCD00F63AFCEFCD00F63AFDEFCD00F6C38BF43AFDEF373F17320B
:20046000F2EF3AFCEF1732F1EF3AFBEF1732F0EF3E51CD00F63AF0EFCD00F63AF1EFCD00EC
:20048000F63AF2EFCD00F697CD00F63E95CD00F616FFCD6CF6FE00CAA1F415C292F43EFD5F
:2004A000C9CD6CF6FEFECAB0F415C2A1F43EFCC921F4EF56235E2600CD6CF61213CD6CF6E7
:2004C000121325C2B8F4CD6CF6CD6CF697C94D6963724F53000D0A6F7B69626B612053442A
:2004E000206B617274790D0A000D0A6F7B69626B61207A616772757A6B69204F530D0A0092
:200500003E77CD00F697CD00F6CD00F6CD00F6CD00F63DCD00F616FFCD6CF6FE01CA27F597
:2005200015C218F53EE0C93E69CD00F63E40CD00F697CD00F6CD00F6CD00F63CCD00F61650
:20054000FFCD6CF6FEFFC24FF515C241F53EE1C93E7ACD00F697CD00F6CD00F6CD00F6CD4D
:2005600000F63CCD00F616FFCD6CF6FEFFC277F515C268F53EE2C94FCD6CF657CD6CF6CD29
:200580006CF6CD6CF679C93EB032FFEF164C3EF032FFEF3EB032EEEF15C28EF59732FFEFBC
:2005A0003E40CD00F697CD00F6CD00F6CD00F6CD00F63E95CD00F616FFCD6CF6FE01CAC7ED
:2005C000F515C2B9F53EFFC93E48CD00F697CD00F6CD00F63CCD00F63EAACD00F63E87CDF9
:2005E00000F616FFCD6CF6FEFFC2F0F515C2E4F5CD6CF6CD6CF6CD6CF6CD6CF6C9000000E8
:2006000047C5473AFFEFE60E4FE521FFEF78E68077F65077780747E68077F65077780747F0
:20062000E68077F65077780747E68077F65077780747E68077F65077780747E68077F65077
:2006400077780747E68077F65077780747E68077F650777932FFEFE1C178C90000000000E7
:20066000000000000000000000000000D5E521FFEF1190D073727EE601074773727EE6015E
:20068000B0074773727EE601B0074773727EE601B0074773727EE601B0074773727EE6013A
:2006A000B0074773727EE601B0074773727EE601B0E1D1C9FFFFFFFFFFFFFFFFFFFFFFFF8B
:2006C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A
:2006E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A
:20070000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9
:20072000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9
:20074000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9
:20076000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99
:20078000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79
:2007A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59
:2007C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFC300F032FFEFC300E032FFEFE90A03FE00CAD3
:2007E000EBF7671A13BCCADBF73EFFC9E521FFEF5E720A73E1C9E521FFEF5E720273E1C957
:00000001FF
Здесь приведен полный код прошивки в формате HEX (2048 байт). Чтобы получить бинарник, можно воспользоваться утилитой HEX2BIN.

Листинг
F000: CALL F0D0
F003: CPI A,00
F005: JZ F01A
F008: LXI H,F4D5
F00B: CALL F818
F00E: JMP F89D
F011: LXI H,F4E9
F014: CALL F818
F017: JMP F89D
F01A: LXI H,EFFA
F01D: SUB A
F01E: MOV M,A
F01F: INX H
F020: MOV M,A
F021: INX H
F022: MOV M,A
F023: INX H
F024: MOV M,A
F025: LXI D,EFF5
F028: STAX D
F029: MVI A,E0
F02B: DCX D
F02C: STAX D
F02D: CALL F42F
F030: CPI A,00
F032: JNZ F008
F035: LDA E000
F038: CPI A,EB
F03A: JZ F069
F03D: LDA E1FF
F040: CPI A,AA
F042: JNZ F011
F045: LXI B,E1C6
F048: LXI D,EFFD
F04B: LDAX B
F04C: STAX D
F04D: INX B
F04E: DCX D
F04F: LDAX B
F050: STAX D
F051: INX B
F052: DCX D
F053: LDAX B
F054: STAX D
F055: INX B
F056: DCX D
F057: LDAX B
F058: STAX D
F059: CALL F42F
F05C: CPI A,00
F05E: JNZ F008
F061: LDA E000
F064: CPI A,EB
F066: JNZ F011
F069: LDA E1FF
F06C: CPI A,AA
F06E: JNZ F011
F071: LXI B,F4CE
F074: LXI D,E1BB
F077: CALL F7DB
F07A: CPI A,00
F07C: JNZ F011
F07F: LXI B,EFFA
F082: LDAX D
F083: STAX B
F084: INX D
F085: INX B
F086: LDAX D
F087: STAX B
F088: INX D
F089: INX B
F08A: LDAX D
F08B: STAX B
F08C: INX D
F08D: INX B
F08E: LDAX D
F08F: STAX B
F090: CALL F42F
F093: CPI A,00
F095: JNZ F008
F098: MVI B,06
F09A: LDA EFF4
F09D: INR A
F09E: INR A
F09F: STA EFF4
F0A2: CALL F0B9
F0A5: PUSH B
F0A6: CALL F42F
F0A9: POP B
F0AA: CPI A,00
F0AC: JNZ F008
F0AF: DCR B
F0B0: JNZ F09A
F0B3: JMP E000
F0B6: RST 7
F0B7: RST 7
F0B8: RST 7
F0B9: LXI H,EFFD
F0BC: MOV A,M
F0BD: INR A
F0BE: MOV M,A
F0BF: CPI A,00
F0C1: JNZ F0CB
F0C4: DCX H
F0C5: MOV A,L
F0C6: CPI A,F9
F0C8: JNZ F0BC
F0CB: RET
F0CC: NOP
F0CD: NOP
F0CE: NOP
F0CF: NOP
F0D0: MVI E,20
F0D2: CALL F587
F0D5: CPI A,01
F0D7: JZ F0E1
F0DA: DCR E
F0DB: JNZ F0D2
F0DE: MVI A,E0
F0E0: RET
F0E1: CALL F5C8
F0E4: MVI E,60
F0E6: CALL F500
F0E9: CPI A,00
F0EB: JZ F0F5
F0EE: DCR E
F0EF: JNZ F0E6
F0F2: MVI A,E1
F0F4: RET
F0F5: MVI E,20
F0F7: CALL F550
F0FA: CPI A,00
F0FC: JZ F106
F0FF: DCR E
F100: JNZ F0F7
F103: MVI A,E2
F105: RET
F106: MOV A,D
F107: STA EFFE
F10A: SUB A
F10B: RET
F10C: RST 7
-------------------
F42E: RST 7
F42F: LDA EFFE
F432: ANI40
F434: CPI A,40
F436: JNZ F459
F439: MVI A,51
F43B: CALL F600
F43E: LDA EFFA
F441: CALL F600
F444: LDA EFFB
F447: CALL F600
F44A: LDA EFFC
F44D: CALL F600
F450: LDA EFFD
F453: CALL F600
F456: JMP F48B
F459: LDA EFFD
F45C: STC
F45D: CMC
F45E: RAL
F45F: STA EFF2
F462: LDA EFFC
F465: RAL
F466: STA EFF1
F469: LDA EFFB
F46C: RAL
F46D: STA EFF0
F470: MVI A,51
F472: CALL F600
F475: LDA EFF0
F478: CALL F600
F47B: LDA EFF1
F47E: CALL F600
F481: LDA EFF2
F484: CALL F600
F487: SUB A
F488: CALL F600
F48B: MVI A,95
F48D: CALL F600
F490: MVI D,FF
F492: CALL F66C
F495: CPI A,00
F497: JZ F4A1
F49A: DCR D
F49B: JNZ F492
F49E: MVI A,FD
F4A0: RET
F4A1: CALL F66C
F4A4: CPI A,FE
F4A6: JZ F4B0
F4A9: DCR D
F4AA: JNZ F4A1
F4AD: MVI A,FC
F4AF: RET
F4B0: LXI H,EFF4
F4B3: MOV D,M
F4B4: INX H
F4B5: MOV E,M
F4B6: MVI H,00
F4B8: CALL F66C
F4BB: STAX D
F4BC: INX D
F4BD: CALL F66C
F4C0: STAX D
F4C1: INX D
F4C2: DCR H
F4C3: JNZ F4B8
F4C6: CALL F66C
F4C9: CALL F66C
F4CC: SUB A
F4CD: RET
F4CE: MOV C,L
F4CF: MOV L,C
F4D0: MOV H,E
F4D1: MOV M,D
F4D2: MOV C,A
F4D3: MOV D,E
F4D4: NOP
F4D5: DCR C
F4D6: LDAX B
F4D7: MOV L,A
F4D8: MOV A,E
F4D9: MOV L,C
F4DA: MOV H,D
F4DB: MOV L,E
F4DC: MOV H,C
F4DD: ENOP
F4DE: MOV D,E
F4DF: MOV B,H
F4E0: ENOP
F4E1: MOV L,E
F4E2: MOV H,C
F4E3: MOV M,D
F4E4: MOV M,H
F4E5: MOV A,C
F4E6: DCR C
F4E7: LDAX B
F4E8: NOP
F4E9: DCR C
F4EA: LDAX B
F4EB: MOV L,A
F4EC: MOV A,E
F4ED: MOV L,C
F4EE: MOV H,D
F4EF: MOV L,E
F4F0: MOV H,C
F4F1: ENOP
F4F2: MOV A,D
F4F3: MOV H,C
F4F4: MOV H,A
F4F5: MOV M,D
F4F6: MOV M,L
F4F7: MOV A,D
F4F8: MOV L,E
F4F9: MOV L,C
F4FA: ENOP
F4FB: MOV C,A
F4FC: MOV D,E
F4FD: DCR C
F4FE: LDAX B
F4FF: NOP
F500: MVI A,77
F502: CALL F600
F505: SUB A
F506: CALL F600
F509: CALL F600
F50C: CALL F600
F50F: CALL F600
F512: DCR A
F513: CALL F600
F516: MVI D,FF
F518: CALL F66C
F51B: CPI A,01
F51D: JZ F527
F520: DCR D
F521: JNZ F518
F524: MVI A,E0
F526: RET
F527: MVI A,69
F529: CALL F600
F52C: MVI A,40
F52E: CALL F600
F531: SUB A
F532: CALL F600
F535: CALL F600
F538: CALL F600
F53B: INR A
F53C: CALL F600
F53F: MVI D,FF
F541: CALL F66C
F544: CPI A,FF
F546: JNZ F54F
F549: DCR D
F54A: JNZ F541
F54D: MVI A,E1
F54F: RET
F550: MVI A,7A
F552: CALL F600
F555: SUB A
F556: CALL F600
F559: CALL F600
F55C: CALL F600
F55F: CALL F600
F562: INR A
F563: CALL F600
F566: MVI D,FF
F568: CALL F66C
F56B: CPI A,FF
F56D: JNZ F577
F570: DCR D
F571: JNZ F568
F574: MVI A,E2
F576: RET
F577: MOV C,A
F578: CALL F66C
F57B: MOV D,A
F57C: CALL F66C
F57F: CALL F66C
F582: CALL F66C
F585: MOV A,C
F586: RET
F587: MVI A,B0
F589: STA EFFF
F58C: MVI D,4C
F58E: MVI A,F0
F590: STA EFFF
F593: MVI A,B0
F595: STA EFEE
F598: DCR D
F599: JNZ F58E
F59C: SUB A
F59D: STA EFFF
F5A0: MVI A,40
F5A2: CALL F600
F5A5: SUB A
F5A6: CALL F600
F5A9: CALL F600
F5AC: CALL F600
F5AF: CALL F600
F5B2: MVI A,95
F5B4: CALL F600
F5B7: MVI D,FF
F5B9: CALL F66C
F5BC: CPI A,01
F5BE: JZ F5C7
F5C1: DCR D
F5C2: JNZ F5B9
F5C5: MVI A,FF
F5C7: RET
F5C8: MVI A,48
F5CA: CALL F600
F5CD: SUB A
F5CE: CALL F600
F5D1: CALL F600
F5D4: INR A
F5D5: CALL F600
F5D8: MVI A,AA
F5DA: CALL F600
F5DD: MVI A,87
F5DF: CALL F600
F5E2: MVI D,FF
F5E4: CALL F66C
F5E7: CPI A,FF
F5E9: JNZ F5F0
F5EC: DCR D
F5ED: JNZ F5E4
F5F0: CALL F66C
F5F3: CALL F66C
F5F6: CALL F66C
F5F9: CALL F66C
F5FC: RET
F5FD: NOP
F5FE: NOP
F5FF: NOP
F600: MOV B,A
F601: PUSH B
F602: MOV B,A
F603: LDA EFFF
F606: ANI0E
F608: MOV C,A
F609: PUSH H
F60A: LXI H,EFFF
F60D: MOV A,B
F60E: ANI80
F610: MOV M,A
F611: ORI50
F613: MOV M,A
F614: MOV A,B
F615: RLC
F616: MOV B,A
F617: ANI80
F619: MOV M,A
F61A: ORI50
F61C: MOV M,A
F61D: MOV A,B
F61E: RLC
F61F: MOV B,A
F620: ANI80
F622: MOV M,A
F623: ORI50
F625: MOV M,A
F626: MOV A,B
F627: RLC
F628: MOV B,A
F629: ANI80
F62B: MOV M,A
F62C: ORI50
F62E: MOV M,A
F62F: MOV A,B
F630: RLC
F631: MOV B,A
F632: ANI80
F634: MOV M,A
F635: ORI50
F637: MOV M,A
F638: MOV A,B
F639: RLC
F63A: MOV B,A
F63B: ANI80
F63D: MOV M,A
F63E: ORI50
F640: MOV M,A
F641: MOV A,B
F642: RLC
F643: MOV B,A
F644: ANI80
F646: MOV M,A
F647: ORI50
F649: MOV M,A
F64A: MOV A,B
F64B: RLC
F64C: MOV B,A
F64D: ANI80
F64F: MOV M,A
F650: ORI50
F652: MOV M,A
F653: MOV A,C
F654: STA EFFF
F657: POP H
F658: POP B
F659: MOV A,B
F65A: RET
F65B: NOP
F65C: NOP
F65D: NOP
F65E: NOP
F65F: NOP
F660: NOP
F661: NOP
F662: NOP
F663: NOP
F664: NOP
F665: NOP
F666: NOP
F667: NOP
F668: NOP
F669: NOP
F66A: NOP
F66B: NOP
F66C: PUSH D
F66D: PUSH H
F66E: LXI H,EFFF
F671: LXI D,D090
F674: MOV M,E
F675: MOV M,D
F676: MOV A,M
F677: ANI01
F679: RLC
F67A: MOV B,A
F67B: MOV M,E
F67C: MOV M,D
F67D: MOV A,M
F67E: ANI01
F680: ORA B
F681: RLC
F682: MOV B,A
F683: MOV M,E
F684: MOV M,D
F685: MOV A,M
F686: ANI01
F688: ORA B
F689: RLC
F68A: MOV B,A
F68B: MOV M,E
F68C: MOV M,D
F68D: MOV A,M
F68E: ANI01
F690: ORA B
F691: RLC
F692: MOV B,A
F693: MOV M,E
F694: MOV M,D
F695: MOV A,M
F696: ANI01
F698: ORA B
F699: RLC
F69A: MOV B,A
F69B: MOV M,E
F69C: MOV M,D
F69D: MOV A,M
F69E: ANI01
F6A0: ORA B
F6A1: RLC
F6A2: MOV B,A
F6A3: MOV M,E
F6A4: MOV M,D
F6A5: MOV A,M
F6A6: ANI01
F6A8: ORA B
F6A9: RLC
F6AA: MOV B,A
F6AB: MOV M,E
F6AC: MOV M,D
F6AD: MOV A,M
F6AE: ANI01
F6B0: ORA B
F6B1: POP H
F6B2: POP D
F6B3: RET
F6B4: RST 7
---------------------
F7CD: RST 7
F7CE: JMP F000
F7D1: STA EFFF
F7D4: JMP E000
F7D7: STA EFFF
F7DA: PCHL
F7DB: LDAX B
F7DC: INX B
F7DD: CPI A,00
F7DF: JZ F7EB
F7E2: MOV H,A
F7E3: LDAX D
F7E4: INX D
F7E5: CMP H
F7E6: JZ F7DB
F7E9: MVI A,FF
F7EB: RET
F7EC: PUSH H
F7ED: LXI H,EFFF
F7F0: MOV E,M
F7F1: MOV M,D
F7F2: LDAX B
F7F3: MOV M,E
F7F4: POP H
F7F5: RET
F7F6: PUSH H
F7F7: LXI H,EFFF
F7FA: MOV E,M
F7FB: MOV M,D
F7FC: STAX B
F7FD: MOV M,E
F7FE: POP H
F7FF: RET
Здесь листинг, из него удалены пустые места для удобства.

Подпрограммы отправки байта и чтения байта находятся по адресам 0xF600 и 0xF66C соответственно, они написаны в развернутом виде без циклов, это дает высокую скорость работы программы.

Еще раз упомяну, что это сырая, первая версия, которая будет заметно меняться и дополняться. Но уже сейчас акустическая загрузка через директиву «I» мне не требуется.

Устройство загрузки

Как уже говорилось, в загрузочном секторе по адресу 0x1BB находится сигнатура «MicrOS», а после нее 4 байта с адресом программы OS. БСВВ загружает 7 секторов по 512 байт в область 0xE000 — 0xEDFF и передает управление на адрес 0xE000. Загрузка осуществляется в нулевую страницу. Остальные страницы уже заполнит OS, если надо (и когда я налажу «мосты»). Для правильности «Установки» OS на SD карту, нужно после форматирования записать файл с OS. Потом найти номер первого сектора этого файла и прописать в загрузочный сектор сигнатуру и адрес. Адрес нужно указывать в секторах (а не в байтах). Порядок байтов Big-endian, то есть младший байт последний (со старшим адресом).

Кстати, этот процесс установки OS я собираюсь автоматизировать, возможно даже средствами Микроши, тогда будет еще подпрограмма в БСВВ.

Что дальше?

Сейчас бы следовало начать писать OS, но перед этим я решил написать другую программу. SD карты сейчас стоят копейки, и я захотел сделать отдельную SD карту с играми. То есть записать все-все игры, которые я смогу найти в интернете на эту карту, а вместо OS сделать программу, которая показывает мне большой список игр. Можно также сделать поиск игры по названию, при вводе с клавиатуры. После выбора игры, она загружается в ОЗУ и запускается.

Такая программа позволит мне играть в игры на Микроше не заморачиваясь с работой в консоли DOS. Назову я такую программу «Диспетчер игр». И про нее, скорее всего, будет следующая глава.

А на другой карточке я планирую сделать уже нормальный DOS для программ типа Бейсик, Редактор и Ассемблер и т.д.

Немного лирики и популяризации программирования

Как то мы с братом сидели и курили, и он поинтересовался почему у меня такой задумчивый вид?

В то время я продумывал «мосты» и нужно было создать подпрограмму «LDA-Bridge». Но как рассказать о такой задаче человеку, который не знает ни про программирование, ни про ассемблер, ни про то как работает процессор, и вообще…

Я начал так:
Представь, говорю, что имеется 8 складов, и в каждом сидит по начальнику. Есть курьер. Задача наладить пересылку грузов со склада на склад, но есть ограничения. И еще одна трудность, это скорость.
Я пытался сказать, что код курьера получается очень большим, и что получается много обращений к стеку и много операций с регистрами. После чего, для полного понимания, брат задавал мне вопросы, а я на них отвечал, и это сработало!

Однажды он спросил, можно ли сделать 8 курьеров, где каждый прикреплен к своему складу и ему не нужно помнить к кому возвращаться, он возвращается всегда на свой склад.
Это действительно сильно упростило и убыстрило операции. Теперь не требуется перед переключением страниц узнать и запомнить текущую страницу для возврата, можно сразу переключить страницу и прочитать данные. А потом переключить страницу на жестко указанную и вернуться. Это дало результат, хоть и отняло немного места, но очень заметно повысило производительность.

Подытог

Мой «Хеллоуворлд» успешно запускается на обоих машинках. Время от нажатия на «ВК» до появления надписи проходит не более двух секунд, на 3584 байта. Скорее, примерно 1,5 сек. Точнее измерить нечем. Я считаю это неплохим результатом.

На этом, пока, все. Спасибо за внимание! Продолжение следует…