Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ZX-Review-1992-01-12.pdf
Скачиваний:
243
Добавлен:
28.03.2015
Размер:
2.43 Mб
Скачать

ADD A,B

означает "прибавить содержимое регистра B к содержимому регистра A и результат оставить в регистре A".

РАЗДЕЛ B

4.ВВЕДЕНИЕ

ВРазделе B представлены программы в машинном коде. Для простоты и удобства использования они даны в стандартном формате. Во введении описывается этот формат и дается программа на BASICe, которая может быть использована для загрузки программ в память.

Длина:

Это длина программы в байтах.

Количество

Выполнение некоторых программ может потребовать переменных:

 

изменения значения одной или более переменных, передаваемых в

 

программу через буфер принтера.

Контрольная сумма:

Каждая программа дана в виде последовательности целых

 

положительных чисел, помещаемых в последовательные ячейки

 

памяти. Контрольная сумма (т. е. сумма всех чисел вводимой

 

подпрограммы) дается для того, чтобы Вы были уверены в

 

правильности загрузки

Функция:

Дается краткое описание задачи, выполняемой с помощью

 

программы.

Переменные:

Определяются имя, длина и адрес в буфере принтера каждой

 

переменной. Переменная длиной в один байт (целое положительное

 

число в пределах от 0 до 255) передается в программу из BASICa или

 

с клавиатуры через РОКЕ.

POKE ячейка, значение

Двухбайтовая переменная передается с помощью 2 х команд:

POKE ячейка, значение 256*INT(значение/256): POKE ячейка+1,INT(значение/256)

Используемые ячейки являются ячейками памяти буфера принтера

Вызов

Программы вызываются с использованием функции USR, которая

подпрограммы:

должна быть включена в команду. Если программа в машинном коде

 

не передает какое то значение обратно в BASIC по завершению, то

 

используется команда:

 

RANDOMIZE USR адрес

Если Вам надо, чтобы результат был возвращен в регистровой паре ВС, то вызов делается так:

LET A = USR адрес

или

PRINT USR адрес

в зависимости от того, должны ли возвращаемые данные сохраняться в переменной BASICa или выводиться на экран.

Контроль ошибок:

Объясняются проверки, выполняемые программой для нелогичных

 

или противоречивых значений переменных, параметров и т. п.

Комментарии:

Объясняются возможные варианты в программах.

Листинг в машинном

Программы представлены на языке ассемблера. Для загрузки в

коде:

память используется третья колонка "числа для ввода". Все числа

 

здесь даны в десятеричной системе.

Как она работает:

Объяснение принципа работы программы.

Загрузчик машинного кода

Почти все программы из этой книги перемещаемые, т.е. они будут работать корректно независимо от того, в каком месте RAM мы их поместим. Если программа не перемещаемая, то в комментариях объясняется, как она должна быть изменена, если ее

нужно сохранить в другой области памяти. В Разделе A (часть 2) мы видели, что SPECTRUM использует различные части RAM для различных функций и что область между ячейками, указанными системными переменными RAMTOP и UDG предназначена для хранения подпрограмм в машинном коде.

Программа ВР может быть использована для загрузки, изменения и перемещения программы в машинном коде. С ее помощью пользователь может переустановить указатель RAMTOP, что даст больше свободного пространства для машинных кодов; ввести программу с клавиатуры; перейти вперед или назад для корректировки ошибки; вставить или удалить часть программы.

Когда программа ВР запускается, она печатает младший адрес, с которого программа

вмашинных кодах может быть введена и сохранена, т.е. на единицу больший, чем RAMTOP.

Вмашине с 48К памяти младший адрес 65368, если пользователь не обновлял системную переменную RAMTOP. В конце ОЗУ обычно резервируются 168 байтов для UDG, но программа позволяет пользователю использовать и эту область, если он пожелает. Он может также выбрать новый возможный младший адрес, который программа затем помещает в системную переменную RAMTOP, используя команду CLEAR. Данные не могут быть введены по адресу, меньшему, чем 27000, т.к. иначе нарушатся границы области, требующейся для самой программы ВР. Программа ВР запрашивает адрес, с которого должна стартовать программа в машинных кодах. Т.о. пользователь может резервировать область для нескольких процедур и затем загружать их каждую отдельно.

Рисунок BF1 показывает формат дисплея после того, как с ячейки 32000 была загружена программа "screen invert". Первая колонка адрес, вторая содержимое ячейки памяти с этим адресом, третья контрольная сумма. Программа "screen invert" имеет 18 байтов в длину и ее контрольная сумма = 1613. Следовательно, она занимает ячейки от 32000 до 32017, и контрольная сумма дана для ячейки 32017, т. е. сумма содержимого ячеек (32000...32017) равна 1613.

На основном экране внимание пользователя привлекается к одной ячейке содержимое этой ячейки мерцает. Эта ячейка является текущей и первоначально это выбранный стартовый адрес программы. Пользователь вводит целое число между 0 и 255 включительно, которое программа МС LOADER помещает в текущую ячейку. Затем следующий адрес становится текущей ячейкой. Пользователь может не вводить число, а вместо этого выбрать для корректировки вариант, описанный в таблице BT1.

Код

Вариант

В

Перейти на один адрес назад.

В n(число)

Перейти на n адресов назад.

F

Перейти на один адрес вперед.

F n(число)

Перейти на n адресов вперед.

I n( число)

Вставить n байтов, каждый из которых содержит 0.

D n(число)

Удалить n байтов в текущей области.

T

Закончить программу

Таблица BT1. Возможные варианты редактирования машинного кода

Программа ВР. загрузчик машинного кода. (МС LOADER)

100 GO SUB 8100

200 REM ***** Вычисление доступной памяти

210 LET min= 1+РЕЕК 23730+256*РЕЕК 23731

220 LET P = РЕЕК 23732+ 256*РЕЕК 23733

230 LET t = Р min + 1

400 REM ***** Определение стартового адреса

410 PRINT "Lowest possible start ";min,,,"Maximum space availbie = ";t 420 INPUT "Do you wish to change the lowest start address (Y or N) ?";z$ 430 IF Z$="Y" OR Z$="y" THEN GO TO 7000

440 INPUT "Enter address at which to start loading machine code";a 450 IF a<min OR a>p THEN BEEP .2,24: GO TO 440

500 GO SUB 8100

510 LET t=t a+min

520 PRINT "You can use up to ";t;" bytes",,,

530 LET U=PEEK 23675+256*PEEK 23676

540 IF a<u AND u<p THEN PRINT "If you use more than ";u a;" bytes, you will overwrite the user defined graphics area. "

550 IF a>=U THEN PRINT "You will overwrite the user defined graphics area." 560 INPUT "Is that OK (Y or N) ? ";z$

570 IF Z$="N" OR z$="n" THEN GO TO 7000

580 IF Z$<>"Y" AND z$<>"y" THEN BEEP .2,24: GO TO 560 700 REM *** GO AHEAD AND LOAD

710 LET i=a

750 GO SUB 8200

760 INPUT "Enter number, b, f, i, d or t "; z$ 770 IF z$="" THEN BEEP .2,24: GO TO 760

780 LET a$=CHR$(CODE Z$(i) 32*(Z$(i)>"@"))

790 GO TO 800+200*(a$="B")+300*(a$="F")+400*(a$="I")+500*(a$="D")+600*(a$="T") 800 LET X=VAL Z$

810 IF i>p THEN BEEP .2,24: GO TO 750

820 IF X<0 OR X>256 OR X<>INT X THEN BEEP .2,24: GO TO 760 830 POKE i,X

840 LET i=i+1

850 GO TO 740

1000 REM *** Перемещение вперед

1010 LET i=i 1

1020 IF LEN Z$>1 THEN LET i=i+1 VAL Z$(2 TO) 1030 IF i<a THEN LET i=a

1040 GO TO 740

1100 REM *** Перемещение назад

1110 LET i=i+1

1120 IF LEN Z$>1 THEN LET i=i 1+VAL Z$(2 TO) 1130 IF i>p THEN LET i=p

1140 GO TO 740

1200 REM *** Вставка

1210 IF LEN Z$=1 THEN LET n=1: GO TO 1225

1220 LET n = VAL Z$(2 TO): IF n<1 OR n>p 1 OR n<>INT n THEN BEEP .2,24: GO TO 740 1225 CLS: GO SUB 8100: PRINT TAB 6; "Inserting in Progress"

1230 FOR J=p TO i+n STEP 1

1240 POKE J,PEEK (j n)

1250 NEXT J

1260 FOR J=1 TO i+n 1

1270 POKE J,0

1280 NEXT J

1290 GO TO 740

1300 REM *** Удаление

1310 IF LEN z$=1 THEN LET n=1: GO TO 1330

1320 LET n=VAL z$(2 TO): IF n<l OR n>P 1 OR n<>INT n THEN BEEP .2,24: GO TO 74O 1330 IF n<0 OR n>p 1 THEN BEEP .2,24: GO TO 1320

1340 CLS: GO SUB 8100 :PRINT TAB 6; "DELETING IN PROGRESS" 1350 FOR J=1 TO p n

1360 POKE J,PEEK (j+n)

1370 NEXT J

1380 GO TO 740

1400 STOP

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]