Слаботочка Книги

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.

7F (127 дес.)

Переход

Значение х

вперед

равное 7Fh - это максимальный переход вперед

Переход назад

Значение х равное 80h - это максимальный

переход назад

Ячейки памяти содержащие программу в машинных кодах.

Рис. 2.1 Порядок выполнения перехода по относительному адресу

2.3. НЕСКОЛЬКО ПОЛЕЗНЫХ-=-=1?- ; ПРОГРАММ в МАШИННЫХ КОДАХ

: лРгтпо 1ые устоойства, описанные в этой книге, требуют для Своей работы налм1 кодах, которыебудуттакжеподробкошисаны.

приведенные в этом разделе.

2.3.i. ПЕРЕСЫЛКА ДАННЫХ ИЗ ЭКРАННОЙ В НЕКОТОРУЮ ДРУГУЮ ОБЛАСТЬ

Мнемоника Id de,58327 (Е307-шестн.)

Id hi, 16384 (4000-шестн.)

Десятичный код 17

227 33

Комментарий адрес области памяти-58327 215

адрес экранной области-16384 О



Id b,27

настроить счетчик B(l) на

счет до 27

push be

сохранить В(1)

Id b.O

настроить счетчик В (2) на

256(-0)

Id а.(Ы)

переслать данные из экранной

Id (dc)

в буфферную область памяти

inc dc

байт за байтом

inc nl

djnz-7

уменьшается на 1 счетчик В (2)

и выполняется переход на 7 байт назад если не 0

pop be

в счетчик загружается В (1)

djnz -12

уменьшается на 1 счетчик В (1)

и выполняется переход на 12 байт назад если не 0

возврат в БЕЙСИК

Счетчики в этой программе считают до 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
Яндекс.Метрика