![]() | |
Слаботочка Книги 1 [2] 3 4 5 6 7 8 9 10 11 12 13 2.2. ПРОГРАММИРОВАНИЕ В МАШИННЫХ КОДАХ ДЛЯ НАЧИНАЮЩИХ Не стоит пугаться программирования в машинных кодах. Обычные пользователи знакомые с БЕЙСИКОМ считают программирование в машинных кодах сложным и запутанным делом. Однако для повышения скорости работы профамм, например, программирование в машинных кодах - основной способ. Понятно, что перенести картинку из Одной области памяти в другую лучше за 1/30 секунды, чем за 30 секунд. Использование SCREEN $ наглядно демонстрирует это. Программы написанные в машинных кодах отличаются от программ на БЕЙСИКЕ тем, в частности, что отсутствуют номера строк. Для размещения программы можно использовать любую область памяти имеющую адреса от 24000 до верхней границы памяти (RAMTOP); для 16 К СПЕКТРУМА это 32767, а для 48 К версии - 65535. Разумно оставлять достаточно памяти для программ на БЕЙСИКЕ, начииаюпишся с адреса 23760. Размещение программы в машинных кодах сразу за верхней границей БЕЙСИКА приводит к нарушению работы системы. Подходящими начальными адресами для размещения программ в машинных кодах будут 32000 <7D0O в шестнадцатиричном коде) для 16 К СПЕКТРУМА и 64000 (FA00 в шестнадцатиричном коде) для 48 К модели. При загрузке программ в машинных кодах разумно сначала очистить соответствующую область памяти. Например, CLEAR 32000 очищает область памяти с адреса 320i00 и предупреждает использование этой области интерпретатором БЕЙСИКА. Вот несколько методов загрузки программ в машинных кодах: 1. Использование 16-ричного загрузчика: 10 LETD-32000 20 DEFFNA(A$,B)-CODEA$(B)-48 -7+(CODEA$(B)>57) 30 DEFFNC(A$)-16*FNA(A$,1)+FNA(A$2) 40 READA$:IFA$<> * THEN POKE D,FN C(A$) :LET D - D+1 : 60 TO 40 50 DATA-00 , Or, OF ,-.... , ** Строка 50 содержит шестнадцатиричные коды в десятиричном виде, которые будут расположены в памяти начиная с адреса 32000. 2. Использование оператора REM для резервирования области под программу в машинных кодах в начале программы на БЕЙСИКЕ: 1 REM .... любые 50 символов... 10 DATA 6,192,17,10,0,33...(всего 50 чисел) 20 FOR Х-23760ТО 23810 30 READ V : РОКЕ X,V 40 NEXTX Этот пример требует ввода 50 чисел до ввода основной программы, которая вызывает программу в машинных кодах I£TL-USR 23760 Строки 10-40 могут бытьуничтожены до ввода осношюйпрограммы, когда машинные коды будут у же загружены в облать памяти, зарезервированную оператором REM в 1 строке. Загружая программу с листинга можно встретить странную последователь- ность символов в строке 1. Не нужно ее изменять - это программа в машинных кодах в символическом виде. Важно отметить, что всегда в таких случаях используется начальный адрес 23760. Одно из достоинств указанного метода в том, что программа в машинных кодах содержится внутри программы на БЕЙСИКЕ и возможность ее испортить при выполнении меньше. 3. Загрузка программы в машинных кодах в процессе загрузки программы на БЕЙСИКЕ, требует только аДной операции загрузки: 10 FOR X - 32000 ТО 32050 20 READМ; РОКЕХ.М . 30 NEXTX -;~ -jl 40 DATA 1,99,0.33.....и т.д. всего 51 число. 100 .... далее текст осковной програкмы на БЕЙСИКЕ. Количество чисел в операторе ФАТА должно точно фответствовать количеству зарезервированных в ст{юке 10 ячевкпамяти; в нашем примере 51, в противном случае появится сообщение об ошибке ОШ OF DATA ERROR; При запуске программы (вводом команды RUN) MB шинные коды будут эагру женыосновная программа будет вызывать эту программу как и раньше: LET L-USR 32000 Мы выберем 3-ий метод 1Ю следующим причинамил 1. Он прост, только 4 строк *; .,.7 2. В нем не используется 1 бричпые читак как методе 1, что затруднительно для непрофессиональных программистов.. 3. Зафузка происходит быстро (около секунды) и не происходит остановки для удаления лишних строк (как в методе 2). Взамен LET L-USR 32000 может быть использована альтернативная команда БЕЙСИКА, RANDOMIZE USR 32000 Вводить данные нужно внимательно, так как ошибка может привести к разрушению всей программы. Поэтому разумно сохранить (SAVE) программу до ее запуска Программа машинных коЩ, 1фуЩнМ<к поШтоЩЗ, соКрайяетой в памяти даже если будет зафужена новая nptrpe .ца на БЕЙСИКЕ в машинных кодах ( в другую oCuiACTb паяш; конечйр). Программа на БЕЙСИКЕ может быть сохранена обычным способом; SAVE Имя когда нужен автозапуск программы. SAVE Имя UNE 1 или SAVE Имя CODE, если в памяти только программа в машинных кодах, или SAVE Имя CODE стартового адреса, длина программы (если нужно сохранить только часть памяти). Программирование в машинных кодах заключает в себе следующие основные элементы: 1. Зафузка констант в регистры HL, ВС, DE. 2. Преобразование, сравнение, перемещение данных путем выполнения различных операций (увеличение/уменьшение на 1, сложение и т.д.). 3. Ввод и вывод данных из различных регистров, особенно это относится к регистру А (аккумулятору). Многие программы проиячодят загрузку данных в ячейки экранной области памяти, начинающейся с ячейки 16384. 4. Вызов программ из ПЗУ СПЕКТРУМА , например CALL-DRAW. 5. В конце программы в машинных кодах обезателен оператор RET без которого работа системы нарушается. Этот оператор возвращает управление БЕЙСИКУ. В Приложении 1 приведены все машинные коды микропроцессора 280 в 16-рич-ном виде, котда используются шестнадцатиричные загрузчики. В десятичном виде (для загрузки с помощью оператора DATA) их можно представить с помощью таблицы из Приложения 2. Указано также и количество байт в команде. Простая команда пересылки может быть однобайтной; если используется в команде однобайтовое число, то команда двухбайтная; если используется двухбайтное число (например адрес), то команда состоит из 3-х байт. Вместе с мнемоническим сокращением дано краткое описание команды. Регистр HL часто используется для задания адреса ячейки памяти и для изменения содержимого ячейки: ld(hl),NN По этой команде в ячейку памяти загружается шестнадцатиричные число. Адрес ачейки соответствует числу содержащемуся в регистре HL. ldhl,00FF По этой команде я регистр Н загружается число 00, а в регистр L загружается FF(255). 1<1(ЕЕ00),Ы По этой команде в ячейку с адресом ЕЕОО (60 928) загружается число 255. Когда вводится число состоящее из двух байт, то младший байт вводится первым (в ячейку с минимальным номером), а старший вторым, так что приведенный пример будет выглядеть: Мнемоника Шестнадцатиричный Деоггичный команд Id hl,00FF ld(EEOO),hl код команд 21 FF 00 22 00 ЕЕ код команд 33 255 О 34 О На рис.2.1 показаны правила выполнения перехода по относительному адресу при выполнении операции увеличения или уменьшения на 1. (Например jr nz, х). Для перехода вперед значение х лежит в интервале О -127 (цес.), для перехода иазад это значение лежит в интервале 128 - 254, (значение 255 - переход на следующий адрес, 254 - переход на адрес ячейки где хранится значение х и т.д.) Кроме перехода по относительному адресу, возможен переход по абсолютному адресу, например JP NN.
Ячейки памяти содержащие программу в машинных кодах. Рис. 2.1 Порядок выполнения перехода по относительному адресу 2.3. НЕСКОЛЬКО ПОЛЕЗНЫХ-=-=1?- ; ПРОГРАММ в МАШИННЫХ КОДАХ : лРгтпо 1ые устоойства, описанные в этой книге, требуют для Своей работы налм1 кодах, которыебудуттакжеподробкошисаны. приведенные в этом разделе. 2.3.i. ПЕРЕСЫЛКА ДАННЫХ ИЗ ЭКРАННОЙ В НЕКОТОРУЮ ДРУГУЮ ОБЛАСТЬ Мнемоника Id de,58327 (Е307-шестн.) Id hi, 16384 (4000-шестн.) Десятичный код 17 227 33 Комментарий адрес области памяти-58327 215 адрес экранной области-16384 О
Счетчики в этой программе считают до 28 и до 256. Работа программы завершается когда 27x256-6912 байтов будет перемещено. Из них 6144 байтов составляют экранную область, а 768 байт составляют область атрибутов, в которой хранится информация о цвете. 3.3.2. ПЕРЕСЫЛКА ДАННЫХ ОБРАТНО В ЭКРАННУЮ ОБЛАСТЬ ПАМЯТИ Мнемоника Id Ы.ООО add hl,$p Id de, (23653) and sic hl.de push hi pop be Десятичный код 33 О О 57 237 91 101 92 167 237 82 229 193 201 Коментарий обнуление HL сохранить указатель стека в HL загрузка в DE адреса начала свободной области памяти -23653 HL-(DE) bHL; вычисление размеров свободной области передача результата в ВС через стек возврат в БЕЙСИК Загрузите программу. 10 FORX-0TO13 20 READn 30 РОКЕ (32000fx),n 40 МЕХТх 50 DATA 33,0,0,57,237,91,101,92,167,237,82,229,193,201 Эта программа, загруженная в память, может быть вызвана в любой момент с помощью: PRINT USR 32000 Для загрузки этой программы может ыте йсрльзован альтернативный REM-ме-1 REM eacaflwaaajaaaaaaaaaaa 10 ОАТАЗЗ,0.0,57,237.91,10Г;9Ш7Й?7,82,2<>Л93,201 20 FOR х-23760ТО 23773 * 30 READn: РОКЕх,п 40 NEXTx Программа вызывается с помощью: PRINT USR 23760 в любом месте вызываемой Тфограммы. 2.3.1 npomiiSijiuRCE в этом разделе описана программа которая будет использована во всех электрш-ных устройствах, описанных в книге. Она позволяет отображать символы ( буквы, цифры, знаки препинания) произвольного размера в любой точке экрана. Параметры, определяющие размер и размещение символов задаются в программе на БЕЙСИКЕ так, как показано на рис.2.2. ![]() Рис.2.2. Параметры используемш в пршрамие ХмС Диапазон изменения параметров: Уог0до175 Хог0до225 1 [2] 3 4 5 6 7 8 9 10 11 12 13 |
|