ZX-Ревю 1995 №1 1994 г.

Читатель-читателю - Опыт работы с "BLAST"


Опыт работы с "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.

блока




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Реклама - Реклама и объявления ...
Юмор - очень серьезная реклама.
Программистам - О глюках в Shadow Service Monitor'e (Скорпион)
Пролог - Новогодние приветствия.
Z80 - несколько недокументированых "жучков" процессора Z80.

В этот день...   19 апреля