ZX учебный класс - CODE, CHR$, POKE и PEEK в BASIC для ZX Spectrum

ZX Revija #03

ZX Учебная: BASIC / Машинный код

CODE

Используется для преобразования символа в соответствующий код.

Общий вид функции:

CODE строка

где:

строка — произвольная строка символов.

Примечание:

Как известно, существует 256 различных символов, и у каждого из них есть уникальный код — число от 0 до 255.

CHR$

Используется для преобразования числа в соответствующий символ.

Общий вид функции:

CHR$ число
CHR$ числовая переменная
CHR$ (числовое выражение)

Функция CHR$ позволяет получить символ, код которого определяется округлённым целым значением аргумента, указанного в функции.

POKE

Используется для непосредственной записи заданного числового значения в указанную ячейку памяти.

Общий вид команды:

POKE m,n

где:

m — числовое значение, задающее ячейку памяти, в которую следует записать значение n. При этом 0<=m<=65535.

n — числовое значение, которое следует записать в ячейку памяти, заданную значением m. При этом -255<=n<=255.

PEEK

Служит для получения содержимого указанной ячейки памяти.

Общий вид функции:

PEEK адрес

где:

адрес — числовое значение, задающее ячейку памяти, содержимое которой нужно получить.

USR

Имеет два разных назначения. Если используется со строковым аргументом, служит для определения пользовательской графики (или новых символов). Если используется с числовым аргументом, служит для связи программы на BASIC с программой на машинном языке.

USR строка

где:

строка — буквенно-цифровая строка.

BIN

Используется для записи чисел в двоичном виде.

Общий вид:

BIN строка

где:

строка — числовая строка, состоящая из некоторой комбинации восьми следующих подряд нулей и единиц.

Примеры использования рассмотренных выше функций и команд:

10 PRINT CODE
20 PRINT CODE

10 FOR n=32 TO 255
20 PRINT CHR$ n;
30 NEXT n

5 POKE 23756,0
6 POKE 23609,50
10 PRINT PEEK 23756

10 PRINT USR

10 LET a=BIN 10110
20 PRINT a

PLOT

Используется для рисования точки на экране.

Общий вид команды:

PLOT m,n

где:

m — первая координата, или абсцисса, точки, которую нужно нарисовать. Должно выполняться условие 0<=m<=255.

n — вторая координата, или ордината, точки, которую нужно нарисовать. Должно выполняться условие 0<=n<=175.

Точка рисуется путём затемнения точки с координатами m и n.

Примечание:

В команду PLOT можно включить одну из функций PAPER, INK, FLASH, INVERSE и OVER, чтобы изменить характеристики рисуемой точки.

DRAW

Используется для рисования прямой линии (то есть отрезка) или части окружности (то есть дуги).

Общий вид команды:

DRAW x,y

или

DRAW x,y,z

где:

x,y — координаты конечной точки отрезка или дуги, которую нужно нарисовать.

z — величина угла, выраженная в радианах. При z>0 дуга рисуется влево, а при z<0 — вправо.

Примечания:

  1. Форма (a) используется для рисования отрезка, а форма (b) — для рисования дуги.
  2. Координаты x и y могут быть отрицательными. Допустимые значения зависят от положения начальной точки отрезка, который нужно нарисовать.
  3. В команду DRAW можно включить одну из функций PAPER, INK, FLASH, INVERSE и OVER, чтобы изменить характеристики рисуемой точки прямой линии или дуги.

CIRCLE

Используется для рисования окружности.

Общий вид команды:

CIRCLE x,y,z

где:

x,y — координаты центра окружности: соответственно абсцисса и ордината.

z — радиус окружности.

Примечание:

В команду CIRCLE можно включить одну из функций PAPER, INK, FLASH, BRIGHT, INVERSE и OVER, чтобы изменить характеристики точек окружности.

POINT

Служит для определения характеристик указанной точки.

ZX Учебная: BASIC / Машинный код

Общий вид функции:

POINT (x,y)

где:

x,y — координаты заданной точки, причём 0<=x<=255, 0<=y<=175.

Функция POINT возвращает значение 0 или 1. Если точка с координатами (x,y) имеет цвет INK, результатом будет значение 1, а если эта точка имеет цвет PAPER — результатом будет значение 0.

Примеры использования предыдущих функций и команд:

10 FOR n=0 TO 100
20 PLOT n,n*n/100
30 NEXT n
10 PLOT 100,20
20 DRAW 150,50:PAUSE 0
30 DRAW -10,100
40 DRAW -140,-60
10 PLOT 10,30
20 DRAW 100,80,PI
30 DRAW 100,50,PI
40 DRAW -150,-60,-PI
50 DRAW -40,30,PI/2
10 FOR r=20 TO 80 STEP 8
20 CIRCLE r,85,r
30 CIRCLE 254-r,85,r
40 NEXT r
10 PLOT 60,160
20 PRINT POINT (60,160)
30 POINT (60,160)

PAUSE

Обеспечивает временную остановку программы.

Общий вид команды:

PAUSE n

где:

n — время, на которое необходимо временно приостановить программу.

Время измеряется в единицах, равных 1/50 секунды; 0<=n<=65535.

Если n=0, остановка будет неограниченной по времени.

Команду PAUSE можно прервать раньше, чем истечёт время n, нажав любую клавишу.

10 FOR a=0 TO 30
20 PRINT AT 5,a;
30 PAUSE 2:NEXT a
40 PRINT AT 5,31; INKEY$

INKEY$

Служит для получения одного символа при нажатии клавиши. Если в нужный момент не нажата ни одна клавиша, генерируется пустая строка, то есть строка нулевой длины.

Общий вид функции:

INKEY$

Эта функция важна тем, что позволяет вводить данные во время выполнения программы, не используя клавишу ENTER.

Она особенно полезна для программ типа видеоигр.

10 CLS
20 PRINT INKEY$:GO TO 10

SCREEN$

Служит для получения символа из заданной позиции экрана.

Общий вид функции:

SCREEN$ (x,y)

где:

x — число, задающее строку, в которой находится нужный символ;
y — число, задающее столбец, в котором находится нужный символ.

Если символ в указанной позиции не распознан, результатом будет пустая строка, то есть строка нулевой длины.

10 PRINT ekran:PAUSE 0
20 PRINT SCREEN$ (0,3)

Команды для работы с магнитофоном

Первые команды, которым вы научились на своём Spectrum. Что ещё о них сказать?

Вероятно, говорить что-либо излишне, поэтому просто перечислим эти команды: SAVE, VERIFY, LOAD и MERGE.

Команды для работы с принтером

Команды, обеспечивающие работу с принтером: LPRINT, LLIST и COPY.

COPY

Служит для копирования содержимого экрана на принтер. Копируются первые 22 строки экрана.

Общий вид команды:

COPY

Существуют также программы для создания постеров на некоторых более качественных принтерах, например EPSON.

LLIST

Служит для вывода листинга программы на принтер.

Общий вид команды:

LLIST
10 REM LLIST-команда
20 PRINT AT 10,10; ZX REVIJA
30 LLIST
40 STOP

После запуска этой программы строка 20 выведет ZX REVIJA в заданное место на экране, а строка 30 распечатает листинг со строки 10 по строку 40 — но только в том случае, если принтер был включён до запуска программы.

LPRINT

Служит для печати текста на принтере.

Общий вид команды:

LPRINT
10 REM LPRINT-команда
20 LPRINT Ovo je primer za LPRINT-komandu
30 STOP

После запуска этой программы будет напечатан текст в кавычках из строки 20.

ZX Учебная: BASIC / Машинный код

Команды для работы с ZX Microdrive

ZX Microdrive — это особый тип дискового накопителя, предназначенный для хранения больших объёмов данных. Команды: CAT, CLOSE#, ERASE, FORMAT, MOVE и OPEN#. Сейчас мы не будем рассматривать эти команды, но когда будем рассказывать о ZX Microdrive и его использовании, подробно разберём и их.

На этом мы завершаем краткий курс по BASIC. Желающие узнать больше о BASIC могут заказать видеокурс BASIC-VIDEO-KURS V 2.00: он стоит 40,00 динаров на отечественных кассетах или 70,00 динаров на кассетах TDK или SONY. С этого номера в нашей рубрике мы начинаем знакомство с машинным языком.

Машинный код

Представим, что вы вообще не знаете, что такое машинный язык, как на нём программировать и… то есть совсем ничего не знаете о машинном коде. Для начала будем учиться на примере BASIC-программы. Программа на BASIC состоит из программных строк. У каждой строки есть номер, который определяет её место в программе.

10 PRINT 10
20 NEW

Из этой программы видно, что сначала будет выведено число 10, а уже потом выполнится команда NEW. Конечно, всё происходит очень быстро, так что вы едва заметите выполнение команды в строке 10. Но если добавить PAUSE 0 в строке 15, программа не будет стёрта из памяти, пока вы не нажмёте какую-нибудь клавишу.

Это значит, что компьютер выполняет команды от меньшего номера к большему, если только в программе нет команд GO TO или GOSUB.

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

Поскольку центральный процессор Spectrum выполняет 686 различных машинных команд и кодов очень много, был введён символический машинный язык, команды которого вводятся с помощью ассемблера.

Этот язык называется мнемоническим машинным языком. Его форма примерно такая:

10 LD a,10

Здесь 10 — номер программной строки, а LD a,10 соответствует команде LET a=10. Но команда LD a,4D означает PRINT — всё зависит от открытого канала, то есть от знаменитого CALL, который определяет остальные функции программы.

Машинную программу можно вводить и с помощью команд DATA и POKE: с их помощью команды помещаются в память. Вводить коды в память командой POKE намного проще, но и опасно: программа может заблокироваться, то есть компьютер перестанет работать. Тогда всё придётся повторять заново, а предыдущие усилия окажутся напрасными. Если программа длинная, она требует много времени, а исправить ошибку вы уже не сможете.

С командой DATA намного проще: содержимое строки DATA можно проверить ещё раз, и ещё раз — даже после команды RUN, если компьютер сообщит об ошибке в строке DATA.

Однако и этот способ утомителен, если вы пишете длинную программу на машинном коде. Поэтому и был создан мнемонический, или символический, язык: на нём быстрее всего писать программу и разбираться в написанном, а сам он наиболее похож на настоящий машинный язык, который понимает компьютер.

Чтобы вам было проще научиться писать на машинном языке, в следующих номерах ZX Revije мы опубликуем несколько таблиц.

Прежде всего нужно понять, как работает ваш компьютер, какова его ёмкость, что такое ячейки памяти и так далее. За скорость выполнения программ отвечает легендарная микросхема Z80A, работающая на частоте 3,5 МГц. Это не так уж быстро, но вполне достаточно для быстрой работы большинства программ.

Помимо упомянутого ассемблера, машинную программу можно вводить с помощью загрузчиков DEC-loader, M.C.M, EZ-CODE и HEXLOAD. О каждом из них мы расскажем отдельно в следующих номерах.

А теперь вернёмся к ассемблеру. Он переводит мнемонический язык в машинный язык Spectrum, то есть в нули и единицы.

Ассемблер преобразует программу только после того, как вы введёте её целиком и нажмёте соответствующую клавишу.

Если вы ошиблись, всё придётся вводить заново, но этого можно избежать, используя более совершенное программное обеспечение. Это вкратце об АССЕМБЛЕРЕ, а теперь немного о ДИСАССЕМБЛЕРЕ. Он считывает то, что записано в машинном коде. Поскольку с его помощью тоже учатся, его ОБЯЗАТЕЛЬНО нужно приобрести. А теперь предлагаем несколько программ, написанных на BASIC с машинным кодом:

ЗВУК ЛЕСА
10 DATA 243,33,0,0,17,255,251,201
   :FOR A=40001 TO 40031:READ N:POKE A,N:
   NEXT A:FOR N=1 TO 100:
   RANDOMIZE USR 40001:
   NEXT N

ЗВУК БУДИЛЬНИКА
10 DATA 6,16,17,2,0,33,16,245,201
   :FOR A=40001 TO 40020:READ N:POKE A,N:NEXT A
   :FOR N=1 TO 200:RANDOMIZE USR 40001:NEXT N

10 FOR N=16384 TO 22527
20 POKE N,INT(RND*255)+1
30 NEXT N

10 FOR N=22528 TO 23295
20 POKE N,INT(RND*100)+1
30 PAUSE 10
40 NEXT N

Поделитесь вашим мнением о статье