Может быть, стоит на базе
этюдов и почившего в бозе разде-
ла для начинающих создать ка-
кой-то уголок программиста, в
котором систематизированно осве-
щать практические приемы прог-
раммирования. Уровень начинающе-
го проходится довольно быстро, а
между начинающим и мастером -
большой диапазон промежуточных
уровней, представители которых и
составляют большую часть читате-
лей "Ревю".
Для повышения общего уровня
грамотности не мешало бы систе-
матизировать способы сокращения
размера типовых процедур и повы-
шения их быстродействия, особен-
но для процедур копирования бло-
ков памяти. В принципе, это все
уже приводилось, но разбросано
по разным номерам. А в послед-
нее время в программах начинают
встречаться фрагменты типа:
LOOP LDI ; 16 тактов
JP PE,LOOP ; 10 тактов
(Информация о времени выпол-
нения команд взята из трехтомни-
ка по программированию в машин-
ных кодах. "Инфорком", 1993г.)
Очевидно, автор где-то про-
читал, что LDI быстрее LDIR (21
такт). В результате длина больше
на три байта, а быстродействие
ниже на 5 тактов в каждом цикле
перемещения байта.
Кажется, уже кто-то предла-
гал заняться коллективным прог-
раммированием. Написать таким
способом игру, имеющую большую
коммерческую ценность, малове-
роятно, хотя бы потому, что вряд
ли у кого хватит сил вручную на-
бивать огромное количество
спрайтов. Но написать еще один
вариант TETRIS или BALL BREAKER
с минимальным количеством спрай-
тов вполне возможно. Сама игра
не имеет первостепенного значе-
ния. Главное - показать весь
процесс создания законченной
программы. А разработанные за
это время процедуры можно в
дальнейшем использовать в само-
стоятельно разрабатываемых прог-
раммах.
Если в результате появится
еше хотя бы несколько десятков
программистов, пишущих для
SPECTRUM, лучше будет всем, по-
тому что рынок программного
обеспечения невозможно насытить
увеличением количества предла-
гаемых программ. Чем больше
программ, тем больше пользовате-
лей и больше спрос на другие
программы. А количество тем для
программирования бесконечно.
ПРОЦЕДУРА ПОИСКА
ТЕКСТОВЫХ ФАЙЛОВ
Я не встречал пока ни одно-
го дискового доктора, поддер-
живающего альтернативную коди-
ровку, ставшую фактическим стан-
дартом текстовых файлов
ZX-SPECTRUM. Для упрощения про-
цесса восстановления дисков, со-
держащих текстовые файлы
ZX-WORD, ZX/IBM EDITOR, ZX-ASM и
т.п., предлагаю процедуру прос-
мотра дисков с разрушенным ката-
логом.
Начальные дорожка и сектор
задаются в переменной TRACK. На
экран выводится содержимое трех
смежных секторов. В верхней час-
ти экрана печатаются номера до-
рожки и сектора, с которых начи-
нается вывод. Секторы выделяют-
ся цветом фона.
При нажатии BREAK происхо-
дит выход из процедуры, при на-
жатии любой другой клавиши выво-
дится дамп следующих трех секто-
ров.
По адресу FONT в процессе
компиляции загружается знакоге-
нератор, содержащий образы 256
символов с кодами 0-255.
LOADCODE - директива ассемблера
XAS, выполняющая загрузку блока
кодов. Если Вы пользуетесь дру-
гим ассемблером, замените ее
аналогичной директивой Вашего
ассемблера. Для ZEUS это PLACE,
для TASM, ALASM - INGBIN, ZX-ASM
3 - INSERT.
Знакогенератор можно соста-
вить самостоятельно, но гораздо
проще извлечь его, при помощи
програмы FIND EDIT FONT, из лю-
бого текстового редактора, ис-
пользующего матрицу 6х8 пиксе-
лов. Еще проще использовать один
из наборов знаков, прилагаемых к
ассемблеру ZX-ASM 3.
Процедура PRIN_42, использу-
ющаяся для печати в формате 42
символа в строке, заимствована
из ZX-Ревю N4-5/96 стр.101 ( (c)
А.Матюшев).
140.
INIT LD HL,#0100 ;H-TRK, L-SEC.
TRACK EQU $-2
LD (#5CF4),HL
XOR A
OUT (#FE),A
LD A,#45
LD (#5C8D),A
START LD HL,#4000
LD DE,#4001
LD (HL),L
LD BC,#1840
LDIR
LD A,#30
LOOP1 LD C,#E0 ; B=0
LD (HL),A
LDIR
SUB 8
CP #18
JR NZ,LOOP1
LD C,31
LD (HL),B
LDIR
LD A,2
CALL #1601
LD DE,MES1
LD C,MES2-MES1
CALL #203C
LD HL,#5CF5
PUSH HL
CALL NUMBER
LD DE,MES2
LD BC,FONT-MES2
CALL #203C
POP HL
DEC HL
CALL NUMBER
LD HL,#0200
LD (XTXT),HL
LD HL,BUFF
PUSH HL
LD DE,(#5CF4)
LD BC,#0305
CALL #3D13
POP HL
LD C,#03 ; B=0
LOOP LD A,(HL)
CALL PRIN_42
INC HL
DJNZ LOOP
PUSH HL
LD HL,YTXT
INC (HL)
POP HL
DEC C
JR NZ,LOOP
KEY XOR A
IN A,(#FE)
OR %11100000
INC A
JR Z,KEY
CALL #1F54 ; BREAK?
RET NC
JR START
NUMBER LD C,(HL)
LD B,0
CALL #2D2B
JP #2DE3
MES1 DEFB 22,00,6
DEFM "TRACK:"
MES2 DEFB 6
DEFM "SECTOR:"
FONT LOADCODE "Font"
PRIN_42 PUSH HL
LD HL,XTXT
LD A,41
CP (HL)
JR NC,WR2
XOR A
LD (HL),A
INC HL
INC (HL)
WR2 POP HL
LD A,(HL)
PRSYM EXX
PUSH HL
LD L,A
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD DE,FONT
ADD HL,DE
PUSH HL
LD DE,(XTXT)
LD A,E
ADD A,A
LD E,A
ADD A,A
ADD A,E
LD E,255
LD L,8
CHPL1 INC E
SUB L
JR NC,CHPL1
ADD A,L
LD H,A
LD A,L
SUB H
LD (SL1-1),A
LD (SL2-1),A
LD A,D; AADR
AND #18
ADD A,#40
LD H,A
LD A,D
AND 7
RRCA
RRCA
RRCA
ADD A,E
LD L,A
POP DE
LD C,8
SCRL LD A,(DE)
LD B,0
SL1 SRL (HL)
DJNZ SL1
AND A
LD B,0
SL2 RL A
RL (HL)
DJNZ SL2
INC HL
LD (HL),A
DEC HL
INC H
INC DE
DEC C
JR NZ,SCRL
LD HL,XTXT
INC (HL)
POP HL
EXX
RET
XTXT DEFB 0
YTXT DEFB 0
BUFF ; буфер для загрузки 3-х секторов
2
Кроме восстановления испор-
ченных дисков, приведенную выше
процедуру можно использовать для
преобразования текстов, содержа-
щихся в HELP-программах, к виду,
пригодному для печати.
Мониторы-отладчики, к сожа-
лению, тоже пока не понимают по-
русски, и более быстрым может
оказаться следующий способ: за-
пускается HELP, вставляется чис-
тый диск и нажимается MAGIC.
Программа после этого может за-
виснуть, но текст будет сохра-
нен в распакованном виде. (Защи-
щать от MAGIC свой рекламный
продукт будет только сумасшед-
ший). Остается просканировать
диск, извлечь текст и при помощи
текстового редактора удалить ко-
довый мусор в начале и в конце
файла.
* * *