ПРИЛОЖЕНИЯ
1. Операторы и функции Laser Basic
Таблица 12
Ключевое слово
|
Действие
|
Граф. пере-меннме
|
Адрес п/п
|
Код
|
Стр.
|
Преобразование окна экрана
|
.iNVV
|
Инвертирование окна экрана
|
.ROW
.COL
.HGT
|
FC38
|
01
|
161
|
.MIRV
|
Зеркальное отображение окна экрана
|
FD26
|
01
|
161
|
.MARV
|
Зеркальное отображение атрибутов окна экрана
|
LEN
|
FD32
|
01
|
161
|
.SETV
|
Установка атрибутов в окне экрана
|
i
|
FF9D
|
01
|
161
|
|
Скроллинг окна экрана
|
|
|
|
|
.CLSV
|
Очистка окна экрана
|
.ROW .COL .HGT .LEN
|
FF8B
|
01
|
161
|
.WL1V
|
Циклический скроллинг окна экрана на 1 пиксель влево
|
F75C
|
01
|
161
|
.WR1V
|
Циклический скроллинг окна экрана на 1 пиксель вправо
|
|
F757
|
01
|
161
|
.SL1V
|
Скроллинг окна экрана на 1 пиксель влево
|
|
F752
|
01
|
161
|
.SR1V
|
Скроллинг окна экрана на 1 пиксель вправо
|
|
F74D
|
01
|
161
|
.WL4V
|
Циклический скроллинг окна экрана на 4 пикселя влево
|
|
F7A5
|
01
|
161
|
.WR4V
|
Циклический скроллинг окна экрана на 4 пикселя вправо
|
|
F785
|
01
|
161
|
.SL4V
|
Скроллинг окна экрана на 4 пикселя влево
|
|
F773
|
01
|
161
|
Ключевое слово
|
Действие
|
Гр«ф. пере-мснныс
|
АД-
n/ti
|
код
|
Crp.
|
.SR4V
|
Скроллинг окна экрана на 4 пикселя вправо
|
.ROW .COL .HGT .LEN
|
F761
|
01
|
161
|
.WL8V
|
Циклический скроллинг окна экрана на 8 пикселей влево
|
F7CB
|
01
|
161
|
.WR8V
|
Циклический скроллинг окна экрана на 8 пикселей вправо
|
F7EA
|
01
|
161
|
.SL8V
|
Скроллинг окна экрана на 8 пикселей влево
|
F7BA
|
01
|
161
|
.SR8V
|
Скроллинг окна экрана на 8 пикселей вправо
|
.ROW .COL .HGT .LEN
|
F7D7
|
01
|
161
|
.WCRV
|
Циклический вертикальный скроллинг окна экрана
|
.ROW
.COL
.HGT
.LEN
.NPX
|
F65D
|
0E
|
162
|
.SCRV
|
Вертикальный скроллинг окна экрана
|
F6CC
|
0E
|
162
|
Скроллинг атрибутов окна экрана
|
.ATLV
|
Скроллинг атрибутов окна экрана влево
|
.ROW .COL .HGT .LEN
|
F7F5
|
01
|
162
|
. ATRV
|
Скроллинг атрибутов окна экрана вправо
|
F818
|
01
|
162
|
. ATUV
|
Скроллинг атрибутов окна экрана вверх
|
F82A
|
01
|
162
|
. ATDV
|
Скроллинг атрибутов окна экрана вниз
|
F874
|
01
|
162
|
Преобразование спрайтов в памяти
|
.INVM
|
Инвертирование спрайта
|
.SPN
|
FC3E
|
13
|
167
|
.MIRM
|
Зеркальное отображение спрайта
|
FD2C
|
13
|
167
|
.MARM
|
Зеркальное отображение атрибутов
|
FD4F
|
13
|
167
|
.SPNM
|
Поворот спрайта на 90°
|
.SP1 .SP2
|
F9DD
|
1С
|
168
|
.DSPM
|
Увеличение размеров спрайта
|
FDB3
|
1С
|
168
|
.SETM
|
Установка атрибутов спрайта
|
.SPN
|
FFBB
|
13
|
167
|
.CLSM
|
Очистка спрайта
|
FEEA
|
13
|
167
|
Скроллинг спрайтов в памяти
|
.WL1M
|
Циклический скроллинг спрайта на 1 пиксель влево
|
.SPN
|
F8C7
|
13
|
167
|
.WR1M
|
Циклический скроллинг спрайта на 1 пиксель вправо
|
F8CC
|
13
|
167
|
Клиь-чееое слово
|
Действие
|
ГР*Ф* пере-
> 1Д1ИИ «А ЯИИЯЯ1яв
|
AA-rt/ti
|
Код
|
Cfp.
|
.SLIM
|
Скроллинг спрайта на 1 пиксель влево
|
.SPN
|
F891
|
13
|
167
|
.SR1M
|
Скроллинг спрайта на 1 пиксель вправо
|
|
F8B5
|
13
|
167
|
.WL4M
|
Циклический скроллинг спрайта на 4 пикселя влево
|
|
F900
|
13
|
167
|
.WR4M
|
Циклический скроллинг спрайта на 4 пикселя вправо
|
|
F8F7
|
13
|
167
|
.SL4M
|
Скроллинг спрайта на 4 пикселя влево
|
|
F8EE
|
13
|
167
|
.SR4M
|
Скроллинг спрайта на 4 пикселя вправо
|
|
F8E5
|
13
|
167
|
. WL8M
|
Циклический скроллинг спрайта на 8 пикселей влево
|
|
F8DB
|
13
|
167
|
.WR8M
|
Циклический скроллинг спрайта на 8 пикселей вправо
|
|
F8E0
|
13
|
167
|
.SL8M
|
Скроллинг спрайта на S пикселей влево
|
|
F8D1
|
13
|
167
|
.SR8M
|
Скроллинг спрайта на 8 пикселей вправо
|
|
F8D6
|
13
|
167
|
.WCRM
|
Циклический вертикальный скроллинг спрайта
|
.SPN .NPX
|
F94B
|
17
|
167
|
.SCRM
|
Вертикальный скроллинг спрайта
|
|
F91E
|
17
|
167
|
Скроллинг атрибутов спрайтов в памяти
|
.ATLM
|
Скроллинг атрибутов спрайта влево
|
.SPN
|
FC9F
|
13
|
167
|
.ATRM
|
Скроллинг атрибутов спрайта вправо
|
|
FCAA
|
13
|
167
|
.ATUM
|
Скроллинг атрибутов спрайта вверх
|
|
FCAF
|
13
|
167
|
.ATDM
|
Скроллинг атрибутов спрайта вниз
|
|
FCC8
|
13
|
167
|
Разрешение/запрещение переноса атрибутов
|
.ATON
|
Разрешение переноса атрибутов
|
-
|
FA05
|
00
|
160
|
.ATOF
|
Запрещение переноса атрибутов
|
|
FAOD
|
00
|
160
|
Перемещения: окно экрана — спрайт
|
.GTBL
|
Копирование окна экрана в спрайт
|
.SPN
.ROW
.COL
|
F286
|
33
|
166
|
.GTOR
|
Наложение окна экрана на спрайт по принципу OR
|
|
F28E
|
33
|
166
|
.GTXR
|
Наложение окна экрана на спрайт по принципу XOR
|
|
F296
|
33
|
166
|
.GTND
|
Наложение окна экрана на спрайт по принципу AND
|
|
F29E
|
33
|
166
|
7 Зак. № 192
слово
|
Дейспие
|
Гр*Ф> переменные
|
A*
n/n
|
КОД
|
CTpi
|
Перемещения: спрайт — окно экрана
|
.PTBL
|
Вывод спрайта на экран
|
.SPN
.ROW
.COL
|
F2A6
|
33
|
160
|
.PTOR
|
Наложение спрайта на окно экрана по принципу OR
|
F2AE
|
33
|
164
|
.PTXR
|
Наложение спрайта на окно экрана по принципу XOR
|
|
F2B6
|
33
|
164
|
.PTND
|
Наложение спрайта на окно экрана по принципу AND
|
.SPN
.ROW
.COL
|
F2BE
|
33
|
164
|
Перемещения: окно экрана — окно спрайта
|
.GWBL
|
Копирование окна экрана в окно спрайта
|
.SPN
.ROW
.COL
.HGT
.LEN
|
F2C6
|
2B
|
166
|
.GWOR
|
Наложение окна экрана на окно спрайта по принципу OR
|
F2CC
|
2B
|
166
|
.GWXR
|
Наложение окна экрана на окно спрайта по принципу XOR
|
.SCL .SRW
|
F2D2
|
2B
|
166
|
.GWND
|
Наложение окна экрана на окно спрайта по принципу AND
|
|
F2D8
|
2B
|
166
|
Перемещения: экран — окно спрайта
|
.PWBL
|
Вывод окна спрайта на экран
|
.SPN .ROW .COL .HGT
|
F2DE
|
2B
|
160
|
.PWOR
|
Наложение окна спрайта на экран по принципу OR
|
F2E4
|
2B
|
165
|
.PWXR
|
Наложение окна спрайта на экран по принципу XOR
|
.LEN .SCL .SRW
|
F2EA
|
2B
|
165
|
.PWND
|
Наложение окна спрайта на экран по принципу AND
|
F2F0
|
2B
|
165
|
Перенос атрибутов: экран — спрайт
|
.GWAT
|
Перенос атрибутов окна экрана в окно спрайта
|
.SPN
.ROW
.COL
.HGT
.LEN
.SCL
.SRW
|
FB4F
|
2B
|
166
|
.PWAT
|
Перенос атрибутов окна спрайта в окно экрана
|
FB5A
|
2B
|
160
|
Перемещения: спрайт — окно спрайта
|
.GMBL
|
Копирование спрайта в окно другого спрайта
|
.SP1 .SP2 .SCL .SRW
|
E985
|
23
|
168
|
Кто-чмое слово
|
Действие
|
Греф* пе ре-менные
|
АД-pec
и/л
|
Ко*
|
Crp.
|
.GMOR
|
Наложение одного спрайта на окно другого по принципу OR
|
.SP1 .SP2 .SCL .SRW
|
E991
|
23
|
168
|
.GMXR
|
Наложение одного спрайта на окно другого по принципу XOR
|
E997
|
23
|
168
|
.GMND
|
Наложение одного спрайта на окно другого по принципу AND
|
|
E98B
|
23
|
168
|
.PMBL
|
Копирование окна спрайта в другой спрайт
|
|
E99D
|
23
|
168
|
.PMOR
|
Наложение окна спрайта на другой спрайт по принципу OR
|
|
E9A9
|
23
|
168
|
.PMXR
|
Наложение окна спрайта на другой спрайт по принципу XOR
|
|
E9AF
|
23
|
168
|
.PMND
|
Наложение окна спрайта на другой спрайт по принципу AND
|
|
E9A3
|
23
|
168
|
Перенос атрибутов: спрайт — спрайт
|
.GMAT
|
Перенос атрибутов спрайта в окно другого спрайта
|
.SP1 .SP2 .SCL .SRW
|
FC28
|
23
|
168
|
.РМАТ
|
Перенос атрибутов окна спрайта в другой спрайт
|
|
FC33
|
23
|
168
|
Перемещение спрайта по экрану
|
.MOVE
|
Перемещение спрайта
|
.SP1
.SP2
.ROW
.COL
.HGT
.LEN
|
|
|
165
|
Операции с областью спрайт-файла
|
.ISPR
|
Создание спрайта заданных размеров (понижается нижняя граница спрайт-файла)
|
.SPN .HGT .LEN
|
EC43
|
2B
|
171
|
.SPRT
|
Создание спрайта заданных размеров (повышается верхняя граница спрайт-файла)
|
|
EC48
|
2B
|
171
|
.DSPR
|
Уничтожение спрайта (повышается нижняя граница спрайт-файла)
|
.SPN
|
FE80
|
13
|
171
|
.WSPR
|
Уничтожение спрайта (понижается верхняя граница спрайт-файла)
|
|
F52F
|
13
|
171
|
.RLCT
|
Перемещение спрайт-файла в памяти
|
.MLN
|
-
|
-
|
172
|
Ключевое слова
|
Действие
|
Граф. переменные
|
AA-pec
ft/fl
|
Код
|
Crp.
|
Вспомогательные графические операторы и функции
|
.ADJM
|
Настройка переменных .HGT и .LEN для спрайта
|
.SPN
.ROW
.COL
|
EBF7
|
33
|
172
|
.ADJV
|
Настройка переменных .HGT и .LEN для окна экрана
|
.ROW .COL .HGT .LEN
|
EC11
|
01
|
172
|
?SCV
|
Проверка знакоместа на включенные пиксели
|
.ROW .COL
|
—
|
—
|
172
|
?SCM
|
Проверка спрайта на включенные пиксели
|
.SPN
|
|
—
|
172
|
?TST
|
Определение существования спрайта
|
-
|
-
|
173
|
Сервисные операторы
|
?KBF
|
Проверка клавиши на нажатие
|
.ROW .COL
|
—
|
—
|
174
|
?РЕК
|
16-битовая версия РЕЕК
|
-
|
-
|
-
|
175
|
.POKE
|
16-битовая версия РОКЕ
|
-
|
-
|
-
|
175
|
.RNUM
|
Перенумерация строк
|
-
|
-
|
-
|
175
|
.REMK
|
Удаление ремарок
|
-
|
-
|
-
|
175
|
.TRON
|
Включение трассировки
|
-
|
-
|
-
|
175
|
.TROF
|
Выключение трассировки
|
-
|
-
|
-
|
175
|
2. Использование графических переменных .SP1 и .SP2
Таблица 13
|
Оператор
|
Переменная
|
.GMBL .GMOR .GMXR .GMND
|
.PMBL .PMOR .PMXR .PMND
|
.SPNM
|
.DSPM
|
<5P1
|
откуда
|
куда
|
откуда
|
куда
|
SP2
|
куда
|
откуда
|
куда
|
откуда
|
217 GO TO 250
218 .SET=2:.LEN=k:.HGT=h:.INVV: BEEP .01,30 220 IF INKEY$<>"" THEN GO TO 220
230 .INVV: GO TO 70
250 LET e=USR 15619: REM : SAVE a$CODE s,g
260 IF NOT e THEN GO TO 70
270 LET a$="File not saved": GO TO 2050
300 FOR i=1 TO LEN a$: IF a$(i)<"0" OR
a$(i)>"9" THEN GO TO 70 310 NEXT i: LET m=VAL a$: IF m<=0 OR
m>255 THEN GO TO 70 320 LET n=m
500 .SET=2:.SPN=n:.LEN=k:.HGT=h:.INVV: BEEP
.01,30:.INVV: GO TO 70 1000 POKE 23658,0: CLS : PRINT AT 3,6;"Tape or
Disk? (T/D)" 1010 PAUSE 0: IF INKEY$="t" THEN CLS : LET d=1: GO TO 1040
1020 IF INKEY$<>"d" THEN GO TO 1010 1030 LET d=0
1040 CLS : BEEP .005,30: RETURN
2000 IF a$="" THEN GO TO 70
2010 IF d THEN LOAD a$CODE z,x: GO TO 70
2020 LET e=USR 15619: REM : LOAD a$CODE z,x
2030 IF NOT e THEN GO TO 70
2040 LET a$="Fife not found"
2050 LET i=2
2060 PRINT #1 ;AT 1,0; INK i; FLASH 1;a$: BEEP
1,3: PAUSE 100: GO TO 70 3000 INK 7: PAPER 0: BORDER 0: CLEAR 29999: GO
SUB 1000 3010 IF d THEN LOAD "LASOBJ"CODE : LOAD "LASLOBJ"CODE :
RANDOMIZE USR 62464: LOAD "GRAPH"CODE : GO TO 20 3020 LET e=USR 15619:
REM : LOAD "LASOBJ"CODE 3030 IF NOT e THEN LET e=USR 15619: REM : LOAD
"LASLOBJ"CODE 3040 IF NOT e THEN RANDOMIZE USR 62464: LET e=USR 15619:
REM :
LOAD "GRAPH"CODE 3050 IF NOT e THEN GO TO 20
3060 PRINT #1 ;AT 1,0; INK 2; FLASH 1;"Loading error": BEEP 1,3: PAUSE 100: STOP
Программа сохраняется оператором SAVE "SPRITER" LINE 3000
На магнитном носителе нслел за файлом "SPRITER"
должны быть записаны следующие кодовые файлы: "LASOBJ", "LASLOBJ" и
"GRAPH" (см. Приложение 5).
3. Листинг программы Spriter63
О REM © Pifer Ud. Автор П. Карпов 10 GO SUB 1000
20 POKE 56575,0: CLS : LET h=1: LET k=1: LET n=1: RANDOMIZE
USR 58841: GO TO 30 30 .SET=1
:.ROW=0:.COL=0:.HGT=22:.LEN=32 40 .SET=2:. ROW=0:.COL=0:. SPN= 1 50
.SET=3:.ROW=22:.COL=0:.HGT=2:.LEN=32 60 INPUT "Screen name? "; LINE a$:
LET z=16384: LET x=6912:
GO TO 2000 70 LET s=?PEK62464: LET g=56575-s
80 .SET=3:.SETV:.CLSV: PRINT #1 ;AT 0,0;".SPN=";n;" .LEN=";k;"
.HGT=";h"'Start: ";s;" Lenght: ";g 90 .SET=1
100 PAUSE 0: LET a=CODE INKEY$: GO TO
100+a*(a=98 OR a=99 OR a=100 OR з=103 OR a=108 OR a=110 OR a=112 OR
a=115 OR a=118 OR a>52 AND a<57 OR a=8 AND k>1 OR a=9 AND
k<32 OR a=10 AND h<22 OR a=11 AND h>1)
108 LET k=k—1: GO TO 500
109 LET k=k+1: GO TO 500
110 LET h=h+1: GO TO 500
111 LET h=h—1: GO TO 500
153 .WL8V: .ATLV: GO TO 500
154 .NPX=—8:.WCRV:. ATDV: GO TO 500
155 .NPX=8:.WCRV.-.ATUV: GO TO 500
156 ,WR8V:.ATRV: GO TO 500
198 STOP
199 GO TO 60
200 .SET=2: LET e=?TST: IF NOT e THEN LET a$="Sprite not found" :.LEN=k:.HGT=h: GO TO 2050
201 .DSPR: LET a$="Sprite deleted": LET i=4: GO TO 2060
203 .SET=2: LET e=?TST: IF NOT e THEN .LEN=k:.HGT=h:.ISPR:.GTBL: LET a$="Sprite gotten": LET i=4: GO TO 2060
204 LET a$="Sprite exist": GO TO 2050
208 INPUT "Starting address? ";z: IF z<30000 OR z>56574 THEN GO TO 70
209 ,POKE62464,z: LET x=56575-z: INPUT "Sprite name? "; LINE a$: GO TO 2000
210 INPUT ".SPN="; LINE a$: IF a$="" THEN GO TO 70
211 GO TO 300
212 .SET=2: LET e=?TST: IF NOT e THEN LET a$="Sprite not found":.LEN=k:.HGT=h: GO TO 2050
213 .PTBL: GO TO 500
215 INPUT "Spritefile name? "; LINE a$: IF a$="" OR NOT g THEN GO TO 70
216 IF d THEN SAVE a$CODE s,g: GO TO 70
4. Вызов подпрограмм Laser Basic из машинных кодов64
Интерпретатор Laser Basic можно использовать в
качестве пакета рабочих процедур при написании программ в кодах. Адреса
процедур Laser Basic хранятся в памяти в виде таблицы, начинающейся с
адреса #EC4D65.
В ней на каждый оператор отводится 8 байт. Первые 4 байта — имя
оператора, следующие 2 байта — собственно адрес, 7-й байт —
код типа команды, последний байт — порядковый номер оператора в
таблице.
Графические переменные хранятся в виде наборов
(.SET). На каждый набор отводится 12 байт, начиная с адреса #Е7СВ
(59339). Адрес конкретного набора вычисляет подпрограмма #Е96Е. Перед
обращением к ней в регистр А заносится номер набора (0...15)66, а в HL подпрограмма возвращает требуемый адрес (его лучше представлять через регистровую пару IX).
LD А,<номер набора>
CALL #Е96Е
PUSH HL
POP IX
Переменные в каждом наборе располагаются
|
в следующей пос-
|
ледовательности:
|
|
|
1Х+0
|
младший байт .MLN
|
IX+6
|
.SRW
|
1Х+1
|
старший байт .MLN
|
IX+7
|
.SCL
|
IX+2
|
.ROW
|
IX+8
|
.NPX
|
1Х+3
|
.COL
|
IX+9
|
.SPN
|
IX+4
|
.LEN
|
IX + 10
|
.SP1
|
IX+5
|
.HGT
|
IX + 1 1
|
.SP2
|
В табл. 12 (Приложение 1) и табл. 14 приведена
вся необходимая информация для непосредственного обращения к
подпрограммам Laser Basic. В первой таблице находим интересующий
оператор и определяем адрес процедуры и код типа команды, по которому
из второй таблицы узнаем способ обращения к данной процедуре. Например,
нам нужно выполнить оператор .SETV. В табл. 12 находим адрес —
#FF9D, код операции — #01. Из табл. 14 узнаем, что перед
обращением к подпрограмме регистры В, С, Н и L должны быть загружены,
соответственно, значениями .ROW, .COL, .HGT и .LEN Кроме того,
поскольку оператор .SETV работает с атрибутами, предварительно нужно
занести (если требуется, конечно) в системную переменную AITRP (23693)
байт атрибутов. После по го можно вызвать подпрограмму, которая
установит атрибуты в заданном окне Выглядит тто, например, так.
10 LD А, %01101001 ; задаем INK 5, PAPER 1, BRIGHT 1
20 LD (23693), A 30 ;
40 ;загружаем регистры значениями ,ROW=1, .COL=7, .HGT=4, .LEN—5
50 LD B, 1
60 LD C, 7
70 LD H, 4
80 LD L, 5
90 CALL #FF9D ; выполняем оператор .SETV
Таблица 14. Загрузка регистров процессора при обращении к процедурам Laser Basic.
Иод оператора
|
Соответствие: регистры — переменные
|
00
|
-
|
01
|
B=.ROW, C=.COL, H=.HGT, L=.LEN
|
0Е
|
A=.NPX, B=.ROW, C=.COL, H=.HGT, L=.LEN
|
>13
|
A=.SPN
|
17
|
A=.SPN, B=.NPX
|
1С
|
B=.SP1, C=.SP2
|
23
|
B=.SP2, C=.SP1, D=.SRW, E=.SCL
|
33
|
A=.SPNf B=.ROW, C=.COL
|
5. Спецификация файлов пакета Laser Basic67
Таблица 15
Название
|
Ими файла
|
Т..............
Тип файла
|
Длина
|
Адрес загрузки
|
Диспетчер
|
LASER
|
BASIC
|
7540
|
-
|
Интерпретатор
|
LASOBJ
|
CODE
|
3642
|
58820
|
LASLOBJ
|
CODE
|
1024
|
62464
|
GRAPH
|
CODE
|
3072
|
62464
|
Спрайт-файлы для интерпретатора
|
SPRITE2A
|
CODE
|
5062
|
51513
|
SPRITE2B
|
CODE
|
6271
|
50304
|
|
Им* фонда
|
Тип файла
|
Длмьне
|
Адре*
загрузим
|
Генератор спрайтов
|
SPTGEN
|
BASIC
|
20751
|
-
|
CODE
|
CODE
|
3000
|
49898
|
Спрайт-файлы
для генератора спрайтов
|
SPRITE 1А
|
N. ARRAY
|
1288
|
-
|
SPRITE 1А
|
CODE
|
5062
|
60218
|
SPRITE 1А
|
CODE
|
6
|
23307
|
SPRITE IB
|
N. ARRAY
|
1288
|
-
|
SPRITE IB
|
CODE
|
6272
|
59009
|
SPRITE 1В
|
CODE
|
6
|
23307
|
Демонстрационные программы
|
DEMO
|
BASIC
|
358
|
-
|
SCREEN
|
CODE
|
6912
|
16384
|
SPRITES
|
CODE
|
6852
|
49723
|
BASIC
|
BASIC
|
23790
|
-
|
GAME
|
BASIC
|
352
|
-
|
SCREEN
|
CODE
|
6912
|
16384
|
SPRITES
|
CODE
|
2795
|
53780
|
INVADER
|
BASIC
|
15330
|
-
|
Компилятор
|
COMPCODE
|
CODE
|
3057
|
59800
|
Загрузчик
откомпилированных
программ
|
LOADER
|
BASIC
|
223
|
-
|
RTCODE
|
CODE
|
5736
|
59800
|