Опыт работы с "BLAST"
(С) Вячеслав Солдатов (RenSoft) Приморский край, 1994.
Я сейчас работаю над стратегической игрой "Разрушители", класса "Rebel Star". Скоро она будет готова, и я собираюсь выслать экземпляр для дистрибуции.
А пока пишу вот о чем. Эту программу я написал на Бейсике, но критические точки обрабатывают подпрограммы в машинных кодах. Но все-таки я решил отконпилировать Бейсик-часть (а она составляет примерно 15К). "TOBOS-FP", о котором Вы писали в РЕВЮ, отказался компилировать команды типа RANDOMIZE USR ..., так что пришлось обратиться к наиболее мощному компилятору BLAST, и работать с ним, пользуясь Вашей инструкцией. Но, к сожалению, нашлись довольно существенные отличия от инструкции. Хотя это, может быть, и следствие работы хаккера, снявшего защиту с программы.
Вот наиболее существенные недостатки .
1. Если, вызвав при помощи RANDOMIZE USR подпрограмму в машинных кодах, в ней испортить регистр IX, то программа зависнет. Так что, кроме IY и HL', надо беречь еще и IX. В частности, программа зависает, если подпрограмма в машинных кодах обращается к процедуре ПЗУ BEEPER (#03В5), так как в ней используется команда JP (IX).
2. Строка M=USR ADR (М - любая переменная, ADR - любое выражение), например B»USR 55200, всегда присваивает переменной отрицательное значение. То есть, если в Бейсик можно передать какое-то значение из машинного кода, заслав это число в ВС и дав RET, то BLAST это не поймет. И связи между содержимым ВС и тем, что даст USR - нет.
3. Не все переменные можно объявлять, как целые (командой REM ! INT). Так, объявив переменную 0 - целой, использовав ее в цикле FOR-NEXT, а затем снова в цикле, в любом месте программы, Вы получите сообщение "3, Subscript wrong" - ошибочный индекс. Если же не объявлять как INT, то все O.K. Это же сообщение иногда появляется при считывании операторами READ - DATA. Причем, массивов и близко нет, а ведь в интерпретаторе - все работает.
4. Встроенные операторы, начинающиеся с REM & - не работают. Даже, если йосле REM написать абракадабру, BLAST молча проглотит ее без всяких последствий. А попробуйте написать что-нибудь нестандартное после REM ! - и при компиляции вылезет ошибка, а при прогоне это передастся для обработки Бейсик-интерпретатору.
Но, несмотря на все эти недостатки, я бы рекомендовал всей этот компилятор. Быстродействие у программы очень высокое, можно по много раз вставлять директивы REM • PC0DE и REM ! MACHINE CODE. А ведь программа в ПИ-кодах получается еще короче, чей на Бейсике (если не считать процедур RST). При аварийной остановке (или после BREAK) можно распечатать при помощи PRINT значения всех переменных с Теми именами, с какими они были в Бейсике. Также выводится номер строки, в которой произошла ошибка или остановка. В общем, программа произвела приятное впечатление.
Было бы очень интересу, если кто-нибудь прокомментировал эти проблемы, хотелось бы уз.глть, сталкивался ли кто-нибудь с ®яа-логичными проблемами?
(С) Олег Янковский,
Хабаровский край, 1994.
Предлагаю разновидность бегущей строки, работающей по прерываниям IM 2. Я сократил свою программу после того, как прочитал статью о бегущей строке М.Титова, опубликованную в ZX-PE-ВЮ-94, N1, стр.48.
Бегущая строка (б/с) может размещаться в любом месте экрана и иметь любой по ширине размер (в знакоместах).
00010 |
;ВУ < |
OLEG YANKOVSKIY 1994 |
00020 |
|
ORG |
40000 |
00030 |
|
01 |
|
00040 |
|
LO |
A,#80 |
00050 |
|
LO |
(CICL),A |
00060 |
|
LO |
HL,(POS1) |
00070 |
|
LD |
(POS),HL |
00080 |
|
LD |
A,#30 |
00090 |
|
LD |
I,A |
00100 |
|
IM |
2 |
00110 |
|
EI |
|
00120 |
|
RET |
|
00130 |
C0NT |
ORG |
41000 |
00140 |
|
DI |
|
00150 |
|
LD |
A,#30 |
00160 |
|
LD |
I,A |
00170 |
|
IM |
2 |
00180 |
|
EI |
|
00190 |
|
RET |
|
00200 |
STOP |
ORG |
42000 |
00210 |
|
DI |
|
00220 |
|
IM |
0 |
00230 |
|
EI |
|
00240 |
|
RET |
|
00250 |
|
ORG |
60208 |
00260 |
|
PUSH |
AF |
00270 |
|
PUSH |
BC |
00280 |
|
PUSH |
DE |
00290 |
|
PUSH |
HL |
00300 |
|
LD |
HL,(POS) |
00310 |
|
LD |
L,(HL) |
00320 |
|
LD |
H,0 |
00330 |
|
ADD |
HL,HL |
00340 |
|
ADD |
HL,HL |
00350 |
|
ADD |
HL,HL |
00360 |
|
LD |
DE,(#5C36) |
00370 |
|
ADD |
HL,DE |
00380 |
|
EX |
DE,HL |
00390 |
|
LD |
ВС,32*256+8 |
00400 |
|
LD |
HL,#401F |
00410 |
|
LD |
A,(CICL) |
00420 |
LOOPl |
PUSH |
AF |
00430 |
|
PUSH |
ВС |
00440 |
|
PUSH |
HL |
00450 |
|
LD |
C,A |
00460 |
|
LD |
A,(DE) |
00470 |
|
AND |
С |
00480 |
|
CPL |
|
00490 |
|
CP |
255 |
00500 |
LOOP 2 |
RL |
(HL) |
00510 |
|
DEC |
HL |
00520 |
|
DJNZ |
LOOP 2 |
00530 |
|
POP |
HL |
00540 |
|
POP |
ВС |
00550 |
|
POP |
AF |
00560 |
|
INC |
H |
00570 |
|
INC |
DE |
00580 |
|
DEC |
С |
00590 |
|
JR |
NZ,LOOPl |
00600 |
|
RRCA |
|
00610 |
|
LD |
(CICL),A |
00620 |
|
CP |
#80 |
00630 |
|
CALL |
Z,NEW |
00640 |
END |
POP |
HL |
00650 |
|
POP |
DE |
00660 |
|
POP |
ВС |
00670 |
|
POP |
AF |
00680 |
|
JP |
56 |
00690 |
NEW |
LD |
HL,(POS) |
00700 |
|
INC |
HL |
00710 |
|
LD |
A,(HL) |
00720 |
|
OR |
A |
00730 |
|
JR |
Z,NOV |
00740 |
|
LD |
(POS),HL |
00750 |
|
RET |
|
00760 |
NOV |
LD |
HL,(POS1) |
00770 |
|
LD |
(POS),HL |
00780 |
|
POP |
HL |
00790 |
|
JR |
END |
00800 |
CICL |
DEFB |
#80 |
00810 |
POS |
DEFW |
MES |
00820 |
POS1 |
DEFW |
MES |
00830 |
MES |
DEFM |
"By Oleg " |
00840 |
|
DEFM |
"Yankovskiy* |
00850 |
|
DEFM |
и 1994 •» |
00860 |
|
DEFB |
0 |
Строки с 20 по 120 - это инициализация б/с; с 130 по 190 -продолжают выполнение б/с, остановленной процедурой STOP (строки с 200 по 240). Сама программа б/с начинается со строки 250. В строке 390 задается число, вычисляемое по формуле, в которой 32 -ширина окна б/с, а в 400 строке число #401F - адрес вывода б/с на экран. Сообщение, выводимое б/с, задается в строках 830-8во. Оно обязательно должно заканчиваться кодом 0. Если Вы используете символьный набор ПЗУ, то б/с можно дополнить следующими строками (для получения утолщенного шрифта) : программа обработки прерывания расположится как раз с адреса Ф986С (39020). Адреса процедур CONT и STOP будут соответственно 39006 и 39015.