Программатор ПЗУ (программный интерфейс)
	
	
       Программный   интерфейс   был   разработан   с   учетом   всех    его 
эксплуатационных характеристик. Он должен отвечать следующим требованиям: 
        полнота и краткость отображаемой информации; 
       удобное расположение информации на экране; 
       оперативность работы. 
       Интерфейс программного  обеспечения  был  построен  по  иерархической 
структуре. 
                                    [pic] 
                Рис. 2.1. Интерфейс программного обеспечения 
       Вся  программа  построена  на  основе  типизированных  меню,  которые 
позволят  легко  и  интуитивно  работать,  и  не  потребуют  дополнительного 
времени от учащихся на изучение интерфейса  программы.  Фон,  окна  меню,  и 
текст  отвечают  всем  требованиям  предъявляемым  к  цветовому  оформлению; 
цветовая палитра подобрана  так,  чтобы  глаза  учащихся  как  можно  меньше 
уставали при работе с программатором. Также был разработан новый шрифт,  что 
позволило обеспечить крупные символы букв,  и  русифицированный  программный 
интерфейс. 
       Кадровые окна основного меню и все подпункты меню  на  каждом  уровне 
иерархии  выполнены  в  виде  окон  с   соответствием   каждого   окна   его 
информационному назначению. 
       Межоконный переход  осуществляется  выбором  соответствующего  пункта 
перемещением  по экрану маркера, в виде стрелки, позиция которого  указывает 
на  выбранный  пункт   меню.   Обратный   переход   в   иерархическом   меню 
осуществляться выбором  последнего  пункта  меню  -  «НАЗАД»,  или  нажатием 
функциональной клавиши «ESC». 
       Работа с пунктом меню «Работа с ПЗУ»  возможна  только  после  выбора 
типа ПЗУ в пункте меню «Выбор  ПЗУ»,  это  связанно  с  особенностью  работы 
аппаратной части лабораторного макета «Программатор ПЗУ». 
       2.4. Описание  процесса отладки 
       При  отладке  программного  интерфейса   лабораторного   макета   был 
использован пошаговый режим пяти основных программных модуля:  модуль  меню, 
модуль чтения ПЗУ, модуль записи  ПЗУ,  модуль  тестирования  программатора, 
модуль файловых операций. 
       В  процессе  отладки  были  использована  промежуточная  печать   для 
определения некоторых промежуточных вычислений и кода вводимых с  клавиатуры 
символов и клавиш. 
       Была произведена  отладка  программы  на  выявление  орфографических, 
синтаксических,  логических  и  графических   ошибок   в   экранных   частях 
программы. 
       Осуществлена  отладка  программного  интерфейса   совместно   с   его 
аппаратной частью. Были внесены некоторые изменения в  программу,  связанные 
с обеспечением синхронизации работы  программного  интерфейса  лабораторного 
макета  с его аппаратной частью. 
       2.5. Разработка эксплуатационно-методической документации 
       При эксплуатации лабораторного макета “Програматор ПЗУ” по проведению 
лабораторных работ необходимо: 
        1. Подсоединить интерфесный продов к программатору и  параллельному 
           порту персонального компьютера (оба должны быть обесточены) 
2. Включить питание копьютера 
3. Включить питание на лабораторном макете 
4. Загрузить на компьютере программный интерфейс 
5. Вставить микросхему ПЗУ в слот на лабораторном макете 
6. Ознакомиться с программой 
        7. Выбрать в программе  тип  микросхемы  ПЗУ,  вставленную  в  слот 
           лабораторного макета 
8. Провести тестирование работоспособности программатора 
9. Выполнить задание по работе с лабораторным макетом 
10. Выйти из программы 
11. Выключить лабораторный макет 
12. Выключить персональный компьютер 
13. Снять микросхему ПЗУ со слота лабораторного макета 
       Для  ознакомления  с  устройством   и   работой   программатора   ПЗУ 
пользователю предоставлена документация. 
       2.6. Результаты испытаний 
       В  процессе  дипломного  проектирования   были   получены   следующие 
результаты: 
       Был   разработан   программный   интерфейс    лабораторного    макета 
«Программатор  ПЗУ»,  который  обеспечивает  связь  аппаратного   интерфейса 
лабораторного  макета  с   последовательным   портом   (LPT)   персонального 
компьютера  IBM  PC,  позволяет  считывать  и   записывать   информацию   на 
микросхемы ПЗУ. 
       Также   программный   интерфейс   создает   удобный   режим   общения 
пользователя с программой по принципу экранных меню. 
       Вся программа реализована на персональном компьютере  IBM  PC  486  с 
монитором разрешающей способностью в текстовом режиме 80x60, при палитры  16 
цветов. 
       В ходу отладки  программного  интерфейса  экспериментным  путем  были 
установлены минимальные требования к персональному компьютеру: 
       IBM совместимы персональный компьютер; 
       процессор 286; 
       цветной дисплей; 
       видеоадаптер EGA; 
       операционная оболочка DOS 3.0 или старше; 
       объем оперативной памяти 416 Kb; 
       свободное пространство на жестком диске из расчета: программа  (20Kb) 
        + 64Kb*кол. прошивок ПЗУ. 
       Техническая характеристика программы: 
|Объем программы на жестком диске                   |20 Kb                  | 
|Занимаемая память во время исполнения              |17Kb                   | 
|Скорость чтения микросхемы ПЗУ                     |1Kb/сек.               | 
|Скорость записи прошивки в ПЗУ                     |0.5Kb/сек.             | 
|Тестирование программатора                         |13 сек                 | 
                   3. ОРГАНИЗАЦИОННО-ЭКОНОМИЧЕСКИЙ РАЗДЕЛ 
       3.1.  Оценка  издержек  на  разработку  программного  интерфейса  для 
программатора ПЗУ 
       3.1.1 Статья I. Материальные ресурсы 
       Статья  I  включает  стоимость  всех  видов   сырья   и   материалов, 
расходуемых на изготовление продукции, а  также  транспортно-заготовительные 
расходы. 
       Расчет сырья и материалов приведен в таблице 3.1. 
|Таблица 3.1                                                             | 
                          Расчет сырья и материалов 
|Наименование         |Ед.         |Цена,      |Норма     |Стоимость,   | 
|                     |Измерения   |руб.       |расходов, |руб.         | 
|                     |            |           |шт.       |             | 
|Операционная система |шт.         |342000.00  |1         |342000.00    | 
|MS-DOS 6.20          |            |           |          |             | 
|Язык программирования|шт.         |570000.00  |1         |570000.00    | 
|Borland Turbo Pascal |            |           |          |             | 
|v7.0                 |            |           |          |             | 
|Итого:    |912000.00    | 
|ТЗР=[pic]                                                        |          | 
|                                                                 |(3.1)     | 
ТЗР=912000.00*1%/100%=9120.00 руб. 
|Ст.I=[pic]                           |                                     | 
|                                     |(3.2)                                | 
Ст.I=912000.00+9120.00=921120.00 руб. 
       3.1.2. Статья II. Оплата труда 
       Статья  II  включает  заработную  плату   основных   производственных 
рабочих, в которые непосредственно на рабочих местах выполняют операции,  по 
обработке продукции. 
       Определение норм времени на операции приведено в таблице 3.2. 
|Таблица 3.2                                                                 | 
                                Нормы времени 
|Должность         |Стоимость 1 часа   |Кол-во часов     |Оплата           | 
|Программист       |15000.00 руб.      |60               |900000.00 руб.   | 
|Отладчик          |5000.00 руб.       |15               |75000.00 руб.    | 
|Итого:           |975000.00 руб.   | 
Ст.2=975000.00 руб. 
       3.1.3 Статья III. Отчисления во внебюджетные фонды 
       Статья III включает в себя отчисления в пенсионный фонд (28 %),  фонд 
занятости (1.5 %), медицинское страхование (3.6 %),  социальное  страхование 
(5.4 %), в фонд образования (1 %) и транспортный налог (1 %). 
       Всего 40,5 %  от начисленной заработной платы. 
|Ст.3=[pic]                           |(3.3)                                | 
Ст.3=[pic]= 394875.00 руб. 
       3.1.4. Статья IV.  Расходы на содержание и обслуживание оборудования 
       Статья  IV  включает  в  себя  расходы  на  зарплату  вспомогательным 
рабочим, наладчикам, механикам, стоимость запасных  частей,  вспомогательных 
средств и амортизацию. 
       Начальная  стоимость  персонального  компьютера  IBM  PC/AT   386   - 
2425920.00 руб., норма амортизации - 4% (КОМ),  расходы  составили  97036.80 
руб. 
       Во время разработки и отладки программного обеспечения было потрачена 
89 кВт (ЭНЕР) электроэнергии: 1 кВт - 512.00 руб., 89 кВт - 45568.00 руб. 
|Ст.4=КОМ+ЭНЕР                        |(3.4)                                | 
Ст.4= 97036.80+45568.00=142604.80 руб. 
       3.1.5. Полная себестоимость 
|Пол.Себ.=[pic]                       |(3.5)                                | 
Пол.Себ.=921120.00+975000.00+394875.00+142604.80=2433559.80 руб. 
       3.2. Анализ эффективности внедрения разработанной программы в 
учебный процесс 
       Эффективность внедрения программы заключается в том, что лабораторный 
макет,    для    которого    написана    программа,    позволяет    наглядно 
продемонстрировать чтение и запись ПЗУ в производственных условиях. 
       Лабораторный макет и  программное  обеспечение  обслуживающие  макет, 
позволит улучшить  качество  обучающего  процесса  по  предмету  «Импульсная 
техника», потому, что позволит учащимся непосредственно на практике  изучить 
метод чтения и записи микросхем. 
       Программа для лабораторного макета  проста  и  интуитивна  понятна  в 
обращении;  Сам  макет,  также  прост,  что  позволяет  сразу  преступить  к 
выполнению лабораторной работы, необходимо всего  лишь  только  подключиться 
макет в  сеть,  подсоединить  разъем  к  параллельному  порту  персонального 
компьютера (порт LPT),  вставить  прошиваемую  микросхему  ПЗУ  в  панель  и 
запустить программное обеспечение на персональном компьютере.  Эта  простота 
в обращении позволит не  затрачивать  много  времени  на  обучение  учащихся 
пользованию макетом. 
       Лабораторный макет имеет хорошие показатели повторяемости, не требует 
сложного оборудования для отладки, что  позволяет  легко  внедрить  макет  в 
производство или собирать  его  непосредственно  в  радиомастерских  учебных 
заведений или в домашних условиях. 
       К достоинству макета относятся и 
       низкая себестоимость, так как использованы широкодоступные  детали  и 
материалы; 
       малый ток потребления; 
       малые габаритные размеры; 
       интуитивно понятный программный интерфейс. 
       Все выше перечисленные факторы позволят снизить розничную цену макета 
и  программного  обеспечения  для  него,  а  также  уменьшить   затраты   на 
эксплуатацию,  что  в  условиях  рыночной  экономики  позволяет  повсеместно 
внедрить лабораторный макет по программированию ПЗУ в учебный  процесс.  Сам 
как таковой лабораторный стенд без программного обеспечения не имеет  смысла 
рассматривать, так как без программы, это просто груда металла, так  же  как 
и программа без металла, это  просто  бессмысленный  набор  команд.  Поэтому 
дальше под  словом  макет  будет  рассматривать  совокупность  лабораторного 
стенда и программного обеспечения для него. 
       Так как разработка макета носит социально-направленный характер  (для 
проведения лабораторных работ в  учебных  заведениях  по  курсу  «Импульсная 
техника») и в стоимостном выражении не оценивается. 
     4. МЕРОПРИЯТИЯ ПО ОХРАНЕ ТРУДА. БЕЗОПАСНОСТЬ ТРУДА ПРИ ОБСЛУЖИВАНИИ 
                                ПРОГРАММАТОРА 
       4.1 Требования безопасности к техническим средствам ПЭВМ 
       Технические и периферийные средства ПЭВМ должны отвечать  требованиям 
безопасности при их эксплуатации, монтаже, ремонте и обслуживании  отдельных 
комплексов и систем в целом. Устройства управления ПЭВМ,  устройства  ввода- 
вывода  и  подготовки   данных   в   процессе   эксплуатации   должны   быть 
пожаробезопасными  и  соответствовать  требованиям  безопасности  в  течение 
всего срока службы. 
       Органы управления техническими  средствами  ПЭВМ,  устройства  ввода- 
вывода, средства диагностики и контроля работы  должны  включать  накопление 
статического  электричества  в  опасных  количествах.  Отдельные  блоки  ЭВМ 
допускается эксплуатировать с устройствами снятия электрического заряда. 
       Для предотвращения образования и  защиты  студентов  от  статического 
электричества в помещениях учебно-вычислительного  центра  (УВЦ)  необходимо 
использовать нейтрализаторы и  увлажнители  воздуха,  а  полы  должны  иметь 
антистатическое покрытие. Допустимый  уровень  напряженности  электрического 
поля в помещениях УВЦ не должен превышать 20 кВ/м. 
       Конструктивно отдельные  модули  и  блоки  технических  средств  ПЭВМ 
должны иметь местное освещение  для  обслуживания,  диагностики  и  контроля 
работы,  при  этом  должна   исключаться   возможность   соприкосновение   с 
токоведущими частями электрооборудования. 
       Устройства управления техническими и периферийными  средствами  ПЭВМ, 
обеспечивающие взаимодействие составных частей ПЭВМ, должны  быть  выполнены 
так, чтобы не могла возникнуть опасность  в  процессе  совместного  действия 
отдельных систем и комплекса в целом. 
       Видео терминальное устройство отображения информации должно  отвечать 
основным требованиям безопасности:  яркость  экрана  дисплея  не  менее  100 
кд/м2, высота символов на экране не менее 3.8  мм,  расстояние  от  глаз  до 
экрана не менее 400  мм,  размер  экрана  по  диагонали  не  менее  310  мм, 
количество  точек  на  одной  строке  не  менее  640,   минимальный   размер 
светящейся точки не более 0.4 мм, для монохромного  дисплея  и  0.6  мм  для 
цветного. 
       4.2. Требования безопасности к микроклимату в учебных лабораториях 
       Оптимальные и допустимые условия микроклимата в лабораториях учебного 
вычислительного  центра  (УВЦ)  устанавливаются  с  учетом  избытка   тепла, 
выделяемого  от  технических  и   периферийных   устройств   ПЭВМ,   тяжести 
выполняемой  работы,  а  также  времени   года.   Микроклимат   определяется 
действующими на организм программистов сочетаниями температуры, влажности  и 
скорости движения воздуха. 
       В  лабораториях  УВЦ  необходимо  поддерживать  оптимальные   условия 
микроклимата с помощью вентиляционных и отопительных систем,  выполненных  в 
соответствии с СНИП II-33-75. Температура воздуха в холодный и теплы  период 
года должна быть в пределах +20...25 оС , относительная влажность 60...40  % 
при скорости движения воздуха не более 0.2 м/с, подача наружного  воздуха  в 
помещение лаборатории объемом до 20 м3 на одного  студента  не  должна  быть 
менее 30 м3/ч. 
       Воздух в помещениях работы программистов и операторов  вычислительных 
систем должен быть  очищен  от  вредных  веществ,  пыли  и  микроорганизмов. 
Патогенная флора должна быть исключена. В помещениях лабораторий  УВЦ  общее 
количество колоний на 1 м3  не  должна  превышать  1000.  В  помещениях  УВЦ 
воздух рабочей зоны должен соответствовать  установленным  требованиям  ГОСТ 
12.1.005-76 с незначительным избытком тепла от видеотерминалов  и  устройств 
отображения информации. 
       При  одновременном  нахождении  в  помещениях   УВЦ   технических   и 
периферийных  устройств  ПЭВМ,  программистов  и  операторов  вычислительных 
систем, когда температура внешней среды выше +25 оС, допустимая  температура 
воздуха в помещениях  не  должна  превышать  +31...+33  оС  со  значительным 
избытком тепла от ПЭВМ. При длительном  воздействии  повышенной  температуры 
происходит нарушение  водно-солевого,  белкового  и  витаминного  обменов  в 
организме студентов  УВЦ.  В  результате  наступает  расслабление  организма 
учащихся, снижение внимания и скорости восприятия  с  устройств  отображения 
информации. 
       4.3. Меры безопасности при сервисном обслуживании программатора. 
       В лабораторном макете присутствует опасное для жизни  напряжение  220 
вольт 50 герц. Это напряжение  питает  трансформаторный  блок.  В  остальных 
блоках лабораторного  макета  напряжения  не  превышают  27  вольт,  что  не 
является  опасным.  В  блоке  стабилизатора  и  блоке  нагрузки   происходит 
тепловыделение. Температура частей этих блоков не  превышает  50оС,  что  не 
представляет опасности для человека. 
       Корпус блока трансформатора выполнен из  диэлектрического  материала. 
Шасси  выполнено  из  дюралюминия.  Клемма  заземления  шасси  должна   быть 
выведена на корпус. К этой клемме должно быть подключено заземление. 
        Шнур питания и вилка должны соответствовать ТУ на них,  и  не  иметь 
изломов и нарушений в изоляции. 
       Сетевой тумблер типа ПТ2-2 (напряжение 600 вольт,  ток  до  2  ампер) 
отвечает требованиям электробезопасности. 
       Должны  быть  использованы  сетевые  предохранители   в   стандартных 
держателях. 
        Напряжения и температуры в остальных блоках лабораторного макета  не 
представляют опасности и не требуют особых мер предосторожности. 
       Так как программатор  взаимодействует  при  работе  с  ПЭВМ,  а  ПЭВМ 
является электроустановкой, то к  ней  предъявляются  требования  соблюдения 
всех параметров электробезопасности согласно ТУ на ПЭВМ. Вредными  факторами 
для человека являются: 
       мягкое рентгеновское излучение экрана; 
       мерцание экрана с частотой кадровой развертки; 
       электростатическое поле вокруг экрана; 
       ультрафиолетовое излучение экрана. 
                              СПИСОК ЛИТЕРАТУРЫ 
Скотт Мюллер «Модернизация и ремонт персональных компьютеров», Москва,  изд. 
«Восточная Книжная Компания», 1996г., ISBN 0-7897-0321-1 
Гук «Аппаратные средства  IBM  PC»,  Санкт-Петербург,  изд.  «Питер  Пресс», 
1996г., ISBN 5-88782-036-5 
Фаронов В.В. «Турбо Паскаль 7.0. Начальный курс. Учебное  пособие»,  Москва, 
изд. «Нолидж», 1997г., ISBN 5-89251-012-3 
М.В.  Сергиевский,  А.В.   Шалашов   «Турбо   Паскаль   7.0:   Язык,   среда 
программирования», Москва, изд. «Машиностроение», 1994г., ISBN  5-217-02468- 
2 
Абель П. «Язык Ассемблер  для  IBM  PC  и  программирования»,  Москва,  изд. 
«Высшая школа», 1992г., ISBN 5-101-123447-1 
Гейтс Б. «Дорога в будующее», Москва, изд. «Русская редакция», 1996г.,  ISBN 
5-7502-0019-1 
Информация с сервера www.referats.aha.ru, изд. INTERNET 
CD-библиотека «Все для инженера», изд. InfoLink, 1997г. 
                                                                ПРИЛОЖЕНИЕ 1 
                            ПРОГРАММНЫЙ ИНТЕРФЕЙС 
        Uses DOS; 
        Type TNT = Array[0..65534]Of Byte; 
             Filearray  = Array[1..5000]Of String[12]; 
        Const 
            U0 = Char(200); 
            U1 = Char(201); 
            U2 = Char(202); 
            U3 = Char(199); 
            U4 = Char(198); 
            U5 = Char(203); 
            U6 = Char(193); 
            U7 = Char(192); 
            Up = Char(194)+Char(195); 
            Uf = Char(196)+Char(185); 
            Us = Char(197)+Char(186); 
            Speed = 3; 
                   Hex        :        Array[0..15]Of         Char         = 
       ('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'); 
        Var 
            Buffer  : ^TNT; 
            Filx    : ^filearray; 
            Dirx    : ^filearray; 
            Fake    : ^TNT; 
            ScanCode: Byte; 
            Key     : Char; 
            Screen  : Array[0..50*90] of byte; 
            Segscr  : Word; 
            Ofsscr  : Word; 
            px,py   : Byte; 
            Clr     : Byte; 
            MenuP   : Byte; 
            F       : File; 
            RomSize : Longint; 
            Curd    : String; 
            RomName : String; 
            lxul,lyul,lxdr,lydr : byte; 
       Procedure WaitRt; assembler; 
       Asm 
           mov dx,$3da 
          @wa1: 
           in al,dx 
           test al,8 
           je @wa1 
          @wa2: 
           in al,dx 
           test al,8 
           jne @wa2 
       End; 
       Procedure Color(c1,c2 : byte); 
       Begin 
           clr:=c1+16*c2; 
       End; 
       Procedure Loc(x,y: byte); 
       Begin 
           px:=x; 
           py:=y; 
       End; 
       Procedure WChar(c : char); 
       Begin 
           screen[py*160+px+px]:=byte(c); 
           screen[py*160+px+px+1]:=clr; 
           inc(px); 
            If px=80 Then 
              Begin px:=0; inc(py); 
               If py>25 Then py:=25; 
              End; 
       End; 
       Procedure Shade(x : byte); 
       Var 
           m : byte; 
       Begin 
           For m:=1 To x Do 
             Begin 
               Screen[py*160+px+px+1]:=screen[py*160+px+px+1] And $7; 
               inc(px); 
                If px=80 Then 
                 Begin px:=0; inc(py); 
                  If py>25 Then py:=25; 
                 End; 
             End; 
       End; 
       Procedure Wrt(s : string); 
       Var 
           x: word; 
       Begin 
           For x:=1 To length(s) Do WChar(s[x]); 
       End; 
       Procedure WrtLn(s : string); 
       Var 
           x: word; 
       Begin 
           For x:=1 To length(s) Do WChar(s[x]); 
            px:=0; 
            inc(py); 
             If py>25 Then py:=25; 
       End; 
       Procedure Map; 
       Begin 
           Move(screen,mem[$b800:0],80*50); 
       End; 
       Procedure Cls; 
       Begin 
           FillChar(screen,80*50,0); 
       End; 
       Procedure ReadKey; assembler; 
       Asm 
           xor ax,ax 
           int 16h 
       End; 
       Function ScanKey : char; 
       Var 
           x : byte; 
       Begin 
           x:=255; 
       Asm 
           mov ah,01 
           int 16h 
           jz @nokey 
           mov x,al 
           mov ScanCode,ah 
         @nokey: 
       End; 
           If x<>255 Then ReadKey; 
            ScanKey:=char(x); 
       End; 
       Procedure SkipTime; 
       Var 
           h,m,s,c : word; 
           lh,lm,ls,lc : longint; 
           abstime1,abstime2: longint; 
       Begin 
           GetTime(h,m,s,c); 
           lh:=h; lm:=m; ls:=s; lc:=c; 
           abstime1:=lc+(ls*100)+(lm*60*100)+(lh*60*60*100); 
       Repeat 
           GetTime(h,m,s,c); 
           lh:=h; lm:=m; ls:=s; lc:=c; 
           abstime2:=lc+(ls*100)+(lm*60*100)+(lh*60*60*100); 
       Until (abstime2<>abstime1); 
       End; 
       Procedure MoveMan; 
       Var 
           addr : word; 
           a    : byte; 
           x    : word; 
       Begin 
           addr:=0; 
            For x:=0 To 80*25-1 Do 
             Begin 
              a:=screen[addr]; 
               If (a>207)And(achar(255); 
       End; 
       Procedure Window(xul,yul,xdr,ydr : byte; name : string); 
       Var 
           x,y : word; 
       Begin 
           Loc(xul,yul); 
           Wrt(up); 
            For x:=xul+2 To xdr Do Wrt('-'); 
             For y:=yul+1 To ydr-1 Do 
              Begin 
               Loc(xul,y); Wrt(u0); 
                For x:=xul+1 To xdr-1 Do Wrt(' '); 
                 Wrt(u1); 
                 Shade(2); 
              End; 
             Loc(xul,y); 
             Wrt(u4); 
              For x:=xul+1 To xdr-1 Do Wrt(u7); 
               Wrt(u5); 
               Loc(xul+2,ydr); 
               Shade(xdr-xul+1); 
               x:=length(name) shr 1; 
               y:=(xdr-xul)shr 1+xul; 
               y:=y-x; 
               Loc(y+1,yul); 
               y:=clr; 
               x:=(clr and $F0)shr 4; 
               color(x,clr and $0F); 
               Wrt(name); 
               clr:=y; 
               lxul:=xul; 
               lyul:=yul; 
               lxdr:=xdr; 
               lydr:=ydr; 
       End; 
       Procedure Morph(xf1,yf1,xf2,yf2,xt1,yt1,xt2,yt2 : byte); 
       Var 
           x : word; 
       Begin 
           Window(xf1,yf1,xf2,yf2,''); 
       Repeat 
           MakeMans; 
            If xf1>xt1 Then dec(xf1,((xf1-xt1)Shr speed)+1); 
             If xf1yt1 Then dec(yf1,((yf1-yt1)Shr speed)+1); 
               If yf1xt2 Then dec(xf2,((xf2-xt2)Shr speed)+1); 
                 If xf2yt2 Then dec(yf2,((yf2-yt2)Shr speed)+1); 
                   If yf20 Then dec(yp); 
       Until (Key=chr(13))or(Key=chr(27)); 
              x:=x1-2; 
       Repeat 
              Loc(x,y1+(stepy*yp)); 
              Wrt(' '+chr(205)); 
              WaitRt; 
              Map; 
              inc(x,1); 
       Until x>=x1+lenx; 
              clr:=yt; 
              MenuP:=yp; 
       End; 
       Procedure HexL2Str(l : longint; var s : string); 
       Begin 
           s:=hex[(l shr (4*7))and 15]; 
           s:=s+hex[(l shr (4*6))and 15]; 
           s:=s+hex[(l shr (4*5))and 15]; 
           s:=s+hex[(l shr (4*4))and 15]; 
           s:=s+hex[(l shr (4*3))and 15]; 
           s:=s+hex[(l shr (4*2))and 15]; 
           s:=s+hex[(l shr (4*1))and 15]; 
           s:=s+hex[(l)and 15]; 
       End; 
       Procedure HexB2Str(l : byte; var s : string); 
       Begin 
           s:=hex[(l shr 4)and 15]; 
           s:=s+hex[(l)and 15]; 
       End; 
       Procedure MemEd(name: string); 
       Var 
           x,y         : word; 
           l,l1,p,lpos : longint; 
           s,st        : string; 
           stc         : byte; 
           size        : longint; 
           readsize    : longint; 
           bank        : word; 
           b1,b2       : byte; 
           flag        : boolean; 
           i           :  searchrec; 
       Label Repaint, TryAgain; 
       Begin 
           TryAgain: 
           FindFirst(name,AnyFile,i); 
            If i.Attr And ReadOnly = ReadOnly Then 
             Begin 
              stc:=clr; 
              color(7,4); 
              MorPhL(20,7,56,15); 
              WindowL('File has ReadOnly Attribute!'); 
                         Menu(30,9,2,3,$4b,'Remove             it','Reselect 
       file','Exit','xxx4','xxx5',6); 
               If MenuP=1 Then 
                Begin 
                 MenuP:=8; 
                 exit; 
                End; 
               If MenuP=2 Then 
                Begin 
                 MenuP:=0; 
                 exit; 
                End; 
              clr:=stc; 
              assign(f,name); 
              SetFattr(f,(i.Attr xor ReadOnly)); 
              MorPhL(0,0,77,24); 
              Color(7,6); 
              WindowL('Memory Editor'); 
               goto TryAgain; 
             End; 
           Assign(f,name); 
           reset(f,1); 
           size:=FilesiZe(f); 
           l1:=0; 
           p:=0; 
           lpos:=0; 
           bank:=0; 
           flag:=false; 
            If size>35000 Then readsize:=35000 Else readsize:=size; 
             blockread(f,buffer^,readsize); 
             RePaint: 
              If l1 Div 32767 <> bank Then 
               Begin 
                If flag Then 
                 Begin 
                  color(7,4); 
                  MorPhL(24,7,50,14); 
                  WindowL('Save Changed Data?'); 
                  Menu(36,9,3,2,$4b,'YES','NO','xxx3','xxx4','xxx5',6); 
                   If MenuP=0 Then 
                    Begin 
                     Seek(f,lpos); 
                     blockwrite(f,buffer^,readsize); 
                    End; 
                  MorPhL(0,0,77,24); 
                  Color(7,6); 
                  WindowL('Memory Editor'); 
                 End; 
                lpos:=(l1 div 32767)*32767+(l1 div 32767); 
                Seek(f,lpos); 
                 If size-l1>35000 Then readsize:=35000 Else  readsize:=size- 
       l1; 
                  blockread(f,buffer^,readsize); 
                  bank:=l1 div 32767; 
                  flag:=false; 
              end; 
             l:=l1 and 32767; 
             Loc(2,1); 
             Wrt('address     0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F 
           ASCII'); 
              For x:=2 To 22 Do 
               Begin 
                Loc(2,x); 
                HexL2Str(l+(l1 and (32767 xor $FFFFFFFF)),s); 
                Wrt(s+':  '); 
                 For y:=1 to 16 do 
                  Begin 
                   HexB2Str(buffer^[l],s); 
                   Wrt(s+' '); 
                   inc(l); 
                  End; 
                   For y:=16 Downto 1 Do 
                    Begin 
                     Wrt(char(buffer^[l-y])); 
                    End; 
               End; 
              l:=l1 and 32767; 
       Repeat 
       Repeat 
              stc:=clr; 
              color(6,7); 
              HexB2Str(buffer^[l+p],s); 
              Loc((((p) and 15)*3)+13,(p) shr 4+2); 
              Wrt(s); 
              Loc((((p) and 15))+61,(p) shr 4+2); 
              Wrt(char(buffer^[l+p])); 
              clr:=stc; 
              WaitKey; 
       Until (Key=chr(13))or(ScanCode=$49)or(ScanCode=$51)or(ScanCode=$48) 
             or(ScanCode=$4D)or(ScanCode=$4B)or(ScanCode=$50)or(Key=chr(27)) 
       or((Key>='0')and(Key='A')and(Upcase(Key)='0')And(Key='A')And(Upcase(Key)='0')And(Key='0')and(Key='A')and(Upcase(Key)='0')And(Key='0')And(Key='A')And(Upcase(Key)320+15  then  begin 
       inc(l1,16); p:=320+(p and 15); goto RePaINt; end; end; 
        $48: begin if  (p>15)or(l1<>0)then  dec(p,16);  if  p320+15  then  begin 
       inc(l1,16); p:=320; goto RePaINt; end; end; 
         $4B:  begin  if  (p>0)or(l1<>0)then  dec(p);  if  p319) then begin dec(l1,320) end else  l1:=0;  goto 
       RePaint; end; 
        $51: begin  inc(l1,320);  if  l1>size-336  then  l1:=size-336;  goto 
       RePaint; end; 
       end; 
       Until (key=chr(13))or(Key=chr(27)); 
           If flag Then 
            Begin 
             color(7,4); 
             MorPhL(24,7,50,14); 
             WindowL('Save Changed Data?'); 
             Menu(36,9,3,2,$4b,'YES','NO','','','',6); 
              If MenuP=0 Then 
               Begin 
                Seek(f,lpos); 
                blockwrite(f,buffer^,readsize); 
               End; 
            End; 
           close(f); 
       End; 
       Function LowCase(s : string) : string; 
       Var 
           x : integer; 
       Begin 
           LowCase:=s; 
            For x:=1 To length(s) Do 
             Begin 
              If (s[x]>='A')And(s[x]'.' Then inc(dz); 
            End 
              Else 
               Begin 
                dirx^[fz+1]:=LowCase(i.name); 
                inc(fz); 
               End; 
             FindNext(i); 
       Until DOSERROR<>0; 
           z:=dz+fz; 
           x:=1; 
            For y:=dz To z Do 
             Begin 
              filx^[y]:=dirx^[x]; 
              inc(x); 
             End; 
       Repeat 
           maxp:=curp+17; 
            If maxp>(z-1) Then maxp:=(z-1); 
             For y:=curp To maxp Do 
              Begin 
               Loc(23,3+y-curp); 
               name:=filx^[curp+(y-curp)]; 
                  For   x:=17   DownTo    length(filx^[curp+(y-curp)])    Do 
       name:=name+' '; 
                 If curps=(y-curp+1) Then color(1,2) Else color(7,1); 
                  Wrt('       '+name); 
              End; 
       Repeat 
           WaitKey; 
       Until 
       (Key=chr(13))or(ScanCode=$48)or(ScanCode=$50)or(Key=chr(27))or(ScanCod 
       e=82); 
       Case ScanCode Of 
        $50: inc(curps); 
        $48: dec(curps); 
       82: 
        Begin 
         MOrPhL(10,10,40,15); 
         WindowL('Input File Name .ROM'); 
         y :=1; 
         zs:='        '; 
          Loc(22,12); 
          Wrt('-'); 
       Repeat 
         WaitKey; 
         Loc(21+y,12); 
          If (Key<>chr(13))And(Key<>chr(27)) Then 
           If (Key<>chr(08)) Then 
            Begin 
             If y<>9 Then 
              Begin 
               zs[y]:=Key; 
                Wrt(key+'-'); 
                inc(y); 
              End; 
            End 
           Else 
            If y<>1 Then 
             Begin 
              dec(y); 
              Loc(21+y,12); 
              zs[y]:=' '; 
              Wrt('-  '); 
             End; 
       Until (Key=Chr(13))or(Key=chr(27)); 
         MorPhL(20,8,50,12); 
         Color(7,4); 
         WindowL('!!!!!!!!!!!!'); 
         Loc(30,10); 
         Wrt('Жди давай!'+chr(208)); 
         Map; 
         Assign(f,zs+'.ROM'); 
         Rewrite(f); 
         y:=$FF; 
          For pos:=1 To romsize Do Write(f,byte(y)); 
           close(f); 
           Key:=chr(255); 
           ScanCode:=0; 
           color(7,1); 
           MorPhL(20,2,50,22); 
           WindowL('Выберите файл'); 
           s:=''; 
          Goto RePaint; 
         End; 
        End; 
         If curps>(z-1) Then curps:=(z-1); 
         If (curps>18) Then 
          Begin 
           curps:=18; 
            If curp1 Then dec(curp); 
          End; 
       Until (Key=chr(13))or(Key=chr(27)); 
        Color(7,1); 
         If Key=chr(13) Then 
          Begin 
           FindFirst(filx^[curp+curps-1],00,i); 
           If DOSERROR<>0 Then 
            Begin chdir(filx^[curp+curps-1]); 
             Goto RePaint; 
            End; 
           s:=filx^[curp+curps-1]; 
          End; 
       End; 
       Procedure ReadROM(addr : longint); 
       Var 
          x : word; 
          y : byte; 
       Begin 
          x:=addr; 
          port[$378]:=x and 65535; 
          port[$379]:=x shr 16; 
          y:=port[$380]; 
          fake^[x and 65535]:=y; 
       End; 
       Var 
          x     : byte; 
          s     : string; 
          l     : LONGINT; 
          y     : longint; 
          zs    : string; 
          rsz   : longint; 
          fi,fo : file; 
       Label OpenF; 
       Begin 
          New(buffer); 
          New(filx); 
          New(dirx); 
          New(fake); 
          ofsscr:=ofs(screen); 
          segscr:=seg(screen); 
          LoadFont; 
          MakeMans; 
          GetDir(0,curd); 
          romsize:=0; 
          color(7,5); 
          Window(1,1,26,12,'Главное меню'); 
       Repeat 
          MorPhL(1,1,26,12); 
          Color(7,5); 
          WindowL('Main Menu'); 
               Menu(4,3,2,4,$5b,'Выбор      ПЗУ','Работа      с      ПЗУ','О 
       программе','Вы'+char(208)+'ход','',20); 
           case MenuP of 
       0: 
          Begin 
           Repeat 
            MorPhL(20,10,50,18); 
            color(7,1); 
            WindowL('Выбор типа ПЗУ'); 
                 Menu(23,12,2,3,$1b,'УФ      ПЗУ','ПЗУ      с       плавкими 
       перемычками','Назад','','',26); 
             case MenuP of 
        0: 
          Begin 
           MorPhL(10,10,29,18); 
           color(7,5); 
           WindowL('УФ ПЗУ'); 
           Menu(13,12,2,3,$5b,'2176','573РФ','Назад','','',16); 
            If MenuP<>2 Then 
             Begin 
              romsize:=8*1024; 
              romname:=curd+'\amibio'; 
             End; 
            If MenuP<>2 Then MenuP:=2 Else MenuP:=0; 
          End; 
        1: 
          Begin 
           MorPhL(40,8,70,16); 
           Color(7,5); 
           WindowL('ПЗУ с плавкими перемычками'); 
           Menu(43,10,2,3,$5b,'155РЕ3','556РТ6','Назад','','',16); 
            If MenuP<>2 Then 
             Begin 
              romsize:=16*1024; 
              romname:=curd+'\amibio1'; 
             end; 
            If MenuP<>2 Then MenuP:=2 Else MenuP:=0; 
          end; 
         end; 
       Until MenuP=2; 
          MenuP:=5; 
        end; 
       1: 
          Begin 
           If romsize=0 Then 
            Begin 
             MorPhL(21,6,49,10); 
             Color(7,4); 
             WindowL('Варнинг!!!'); 
             Loc (25,8); 
             Wrt ('Пипл!!! Выбери ПЗУ!!!!'); 
             WaitKey; 
            End 
           Else 
       Repeat 
           MorPhL(40,5,60,15); 
           Color(7,1); 
           WindowL('Работа с ПЗУ'); 
       Menu(44,7,2,4,$1b,'Чтение','Запись','Тестирование','Назад','Num5',12); 
            Case MenuP Of 
         0: 
          Begin 
           MorPhl(22,7,50,11); 
           color(7,1); 
           WindowL('Чтение ПЗУ'); 
           Loc(24,9); 
           Wrt('-------------------------'); 
            For l:=0 To romsize Do 
             Begin 
              Loc(24+(l*24 div romsize),9); 
              Wrt ('-'+chr(208)); 
              Color (3,1); 
              Map; 
              ReadROM(l); 
             End; 
            Color(7,1); 
            MorPhL(0,0,77,24); 
            Color(7,6); 
            WindowL('Просмотр прошивки'); 
            MemEd(romname); 
            Color(7,4); 
            MorPhL(24,7,60,14); 
            WindowL('Сохранить прочитанные данные?'); 
            Menu(40,9,3,2,$4b,'YES','NO','','','',6); 
             Case MenuP of 
          0: 
            Begin 
             MOrPhL(10,10,50,15); 
             WindowL('Имя сохраняемого образа .ROM'); 
             y:=1; 
             zs:='        '; 
             Loc(26,12); 
             Wrt('-'); 
       Repeat 
             WaitKey; 
             Loc(25+y,12); 
              If (Key<>chr(13))And(Key<>chr(27)) Then 
              If (Key<>chr(08)) Then 
               Begin 
                If y<>9 Then 
                 Begin 
                  zs[y]:=Key; 
                  Wrt(key+'-'); 
                  inc(y); 
                 End; 
               End 
              Else 
               If y<>1 Then 
                Begin 
                 dec(y); 
                 Loc(25+y,12); 
                 zs[y]:=' '; 
                 Wrt('-  '); 
                End; 
       Until (Key=Chr(13))or(Key=chr(27)); 
             If key=chr(13) Then 
              Begin 
               MorPhL(20,8,50,12); 
               Color(7,4); 
               WindowL('!!!!!!!!!!!!'); 
               Loc(30,10); 
               Wrt('Жди давай!'+chr(208)); 
               Map; 
               Assign(fo,zs+'.ROM'); 
                Rewrite(fo,1); 
               Assign(fi,romname); 
                Reset(fi,1); 
                rsz:=FileSize(fi); 
       Repeat 
                y:=rsz; 
                 If y>65535 Then y:=65535; 
                  BlockRead(fi,buffer^,y); 
                  BlockWrite(fo,buffer^,y); 
                  rsz:=rsz-y; 
       Until rsz=0; 
               Close(fi); 
               Close(fo); 
       End; 
       End; 
       End; 
        MenuP:=5; 
       End; 
       1: 
        Begin 
         Repeat 
          MenuP:=1; 
          MorPhL(20,2,50,22); 
          color(7,1); 
          WindowL('Выберите файл'); 
          FFile(s); 
           If s<>'' Then 
            Begin 
             MorPhL(0,0,77,24); 
             Color(7,6); 
             WindowL('Редактировение прошивки'); 
             MemEd(s); 
             Color(7,4); 
             MorPhL(24,7,60,14); 
             WindowL('Прошить ПЗУ?'); 
             Menu(40,9,3,2,$4b,'YES','NO','xxx3','xxx4','xxx5',6); 
              If MenuP=0 Then 
               Begin 
                MorPhl(22,7,50,11); 
                Color(7,1); 
                WindowL('Прошиваем ПЗУ'); 
                Loc(24,9); 
                Wrt('-------------------------'); 
                 For l:=0 To romsize Do 
                  Begin 
                   Loc(24+(l*24 div romsize),9); 
                   Wrt ('-'+chr(208)); 
                   Color (3,1); 
                   Map; 
                   ReadROM(l); 
                  End; 
               End; 
            End; 
       Until MenuP<>8; 
        end; 
       2: 
        Begin 
         MorPhl(22,7,50,11); 
         color(7,1); 
         WindowL('Тестируем программатор'); 
         Loc(24,9); 
         Wrt('-------------------------'); 
          For l:=0 To 1000 Do 
           Begin 
            Loc(24+(l*24 div 1000),9); 
            Wrt ('-'+chr(208)); 
            Color (3,1); 
            Map; 
           End; 
          Loc(23,9); 
          Wrt(chr(209)+'  Все в порядке, аднака  '); 
          waitkey; 
        End; 
       end; 
       Until MenuP=3; 
        MenuP:=5; 
       end; 
       2: 
        Begin 
         MorPhL(9,2,70,23); 
         color(7,0); 
         WindowL('О программе'); 
         Loc(10,10); 
          For x:=1 To 60 Do Wrt(chr(210)); 
           Loc(12,4); 
           Wrt('Дипломный проект "Лабораторный макет программатора ПЗУ"'); 
           Loc(11,6); 
           Wrt('Это программка была  написана в среде Borland Pascal v7.0'); 
           Loc(13,8); 
           Wrt('Программа расчита на роботу с 2 типами микросхем ПЗУ'); 
           Loc(36,12); 
           Wrt('Авторы:'); 
           Loc(11,14); 
           Wrt('Идея и текст программы:'); 
           Loc(25,15); 
           Wrt('Дмитрий В. Румянцев'); 
           Loc(11,17); 
           Wrt('Помощь в написание программы:'); 
           Loc(25,18); 
           Wrt('Dead Emotion //HellraiseR Group'); 
           Loc(11,20); 
           Wrt('Тестирование программы:'); 
           Loc(25,21); 
           Wrt('Алексек А. Иванов'); 
           WaitKey; 
         MenuP:=5; 
        end; 
        end 
       until MenuP=3; 
        MorPhL(13,7,13,7); 
       asm 
       mov ax,3 
       int 10h 
       end; 
       end. 
Страницы: 1, 2 
	
	
					
							 |