|
Sinclair Club
#05
31 декабря 2001 |
|
Софт - Странности системных программ: STS 5.1, ALASM 4.1.

┌──────────────────────────────────┐
│ Странности системных программ! │
└──────────────────────────────────┘
──────────────────────────────────────────
(с) Alone Coder/Any
──────────────────────────────────────────
STS 5.1 by STALKER
STS 5.1 имеет весьма странный редактор
строки в режиме Hex Dump.
Если в этой строке стоял символ "▒", то
после нажатия Enter,когда строка скопируе-
тся в память,этот байт будет пропущен. По-
следние байты строки в этом случае будут
взяты из предыдущего варианта (который су-
ществовал до редактирования),а,проще гово-
ря, с потолка.
На этот глюк уже ссылался кто-то где-то
(пойди, найди теперь!), приводился даже
способ исправления,уменьшающий длину буфе-
ра пользователя. Приведу другой способ:
Copy from #DE10 to #DE1B -> #DE0F
#DE1B: JR Z,#DE22
DEC DE
После такого исправления байт, помечен-
ный символом "▒", меняться не будет.
Исправления нужно делать не на работаю-
щем STS'е, а на загруженном в другую стра-
ничку файле sts5.1a!
Неправильное позиционирование на 0-ю
дорожку после смены дисковода - это хрони-
ческая болезнь всех версий STS. Версию 6.2
фиксил Иван Рощин,а по поводу 5.1 вроде бы
пока ничего не известно...
ALASM 4.1 6x7 by ALEM
ALASM имеет глюк при ассемблировании,
связанный с пересечением командой адреса
#8000. В большинстве случаев это приводит
к тому, что кусок команды до адреса #7FFF
включительно компилируется нормально,а ос-
тальная часть затирает начало ALASM'а.
Этот глюк уже описывался MAX'ом в жур-
нале "Чёрная Ворона" #3. Объясняется глюк
тем, что во время своей работы ALASM (как,
впрочем, и другие ассемблеры) перемещается
во 2-ю страничку, а старое её содержимое
в это время хранится в так называемой Sys-
tem page (обычно 4-я страничка). После вы-
хода из ассемблера(а также после RUN,DEBUG
и т.д.) странички,естественно,переставляю-
тся обратно.
Префиксированные команды этим не стра-
дают. Если предыдущая команда закончилась
на #7FFF,а следующая идёт по адресу #8000,
то проблем тоже не возникнет. Да и вообще,
если ты знаешь про этот глюк, то его можно
проконтролировать. Например,процедура ини-
циализации у меня в AC Edit спокойно пере-
секает #8000. Другое дело, что я её ни не
меняю :)).
А лучше,конечно,сразу писать свои прог-
раммы в быстрой памяти.
При переходе через адрес #C000 глюк не
возникает.
Есть ещё один глючок в ALASM, который
исправить невозможно.Он связан со специфи-
чным однопроходным методом компиляции.Пра-
вда, сначала нужно объяснить, как работает
однопроходный компилятор.
Компилятор просматривает текст програм-
мы сверху вниз,ассемблируя команды,опреде-
ляя метки и проставляя определённые пара-
метры команд в их адресную часть.Если ком-
пилятор встречает выражение с не опреде-
лённой выше меткой, то он выдаёт сообщение
об ошибке. Если же он встречает просто не
определённую ранее метку,то он заносит имя
этой метки и адрес адресной части команды
(сорри,каламбур) в таблицу.Когда метка бу-
дет определена, все незаполненные адресные
части команд, долженствующие содержать ад-
рес этой метки, заполняются,и их вхождения
удаляются из таблицы.
Теперь внимание! Как же откомпилируется
такой фрагмент?
DUP 7
LD A,(BC)
XOR (HL)
AND 240
XOR (HL)
LD (DE),A
INC B ;+0
INC H ;+1
INC D ;+2
LD A,D ;+3
AND 7 ;+4
CALL Z,DDEU ;+6
EDUP
ORG $-9
JP PRRQ ;+0
PR1ST PUSH BC ;+3
PUSH DE ;+4
PUSH HL ;+5
BIT 0,C ;+6
JR Z,PR1STL ;+8
...
DDEU LD A,E
ADD A,32
LD E,A
RET C
LD A,D
SUB 8
LD D,A
RET
Внутренности DUP'а откомпилятся 7 раз,
потом текущий адрес переместится на коман-
ду INC B (для удобства я указал для команд
смещение относительно этого адреса), и...
А ведь метка DDEU ещё не определена! И
после того,как она определится,её значение
будет записано по относительному адресу +7
в параметр команды CALL, которая в тот мо-
мент уже не будет существовать! В резуль-
тате будут испорчены ни в чём не повинные
команды BIT и JR !
Поэтому такие куски нужно писать следу-
ющим образом:
DUP 6
LD A,(BC)
XOR (HL)
AND 240
XOR (HL)
LD (DE),A
INC B
INC H
INC D
LD A,D
AND 7
CALL Z,DDEU
EDUP
LD A,(BC)
XOR (HL)
AND 240
XOR (HL)
LD (DE),A
...
А ещё лучше сделать мэйкер.
Глюк с 11-символьным именем диска в ре-
жиме каталога в ALASM'е: если имя диска
имеет все 11 символов, то дальше могут по-
казываться совершенно случайные символы в
произвольном количестве. Правильная же пе-
чать 11-символьного имени должна учитывать
в качестве окончания имени: 1) конец сек-
тора; 2) байт #0; 3) установленный 7-й бит
(который, кстати, при печати нужно сбрасы-
вать).
Наверное,многих достаёт Help при запус-
ке аласма.Его можно убить так(сама команда
Help от этого,разумеется,не пострадает):
#B77E: JP #8B8F
При этом даже освобождаются следующие
15 байт. Хотя,собственно,их можно выиграть
и в другом месте:кодинг у мэтров настолько
оригинальный, что их программы ещё оптими-
зировать и оптимизировать...
В этих 15 байтах (точнее, нам нужно то-
лько 13) мы и размещаем нашу программу пе-
чати имени диска:
#B781: LD A,(HL)
AND 127
RET Z
CALL #8C96
OR (HL)
RET M
INC L
JR NZ,#B781
RET
И меняем ссылку:
#99D1: CALL #B781
Естественно,всё это нужно делать опять-
таки не на работающем аласме, а на загру-
женном по адресу #8000 файле alasm67.
Другие статьи номера:
Похожие статьи:
В этот день... 1 января
SibNews #08,
Woot! #01,
Spectrum Magazine #01,
ACNews #25,
Psychoz #14,
ACNews #14,
Last 128 #08,
Last 128 #06,
Last 128 #05,
Last 128 #04,
Last 128 #03,
Last 128 #02,
Last 128 #09,
Last 128 #3.5,
Last 128 #8.025,
Sinclair Club #05,
Last 128 #M!R 01,
Fantadrom #01,
Buzz #20,
Last 128 #01,
DonNews #13,
Nicron #120,
Promised Land #01,
Inferno #01,
Marazm #25,
Ultimathum #01,
Marazm #21,
Hooy Mag #02,
KrNews #11,
Marazm #22,
Marazm #23,
ZX Football 2000 #01,
Codemania #01,
Always #03,
Bugs #02,
IzhNews #08,
Virtual Worlds #01,
Listok #04,
Scenergy #02,
Flash Info #18,
Marazm #16,
Marazm #17,
Zed #01,
Balagan #02,
ZX Format #08,
ZX Power #03,
Shock #01,
Impulse #02,
Deja Vu #03,
ZX Club #08,
ZX Club #06,
Numberology #01,
Marazm #13,
Marazm #12,
Marazm #14,
Gorodok #02,
Zodiac #01,
Marazm #15,
Deja Vu #07,
Marazm #11,
Deja Vu #07,
Playboy #03,
Crazy News #2,
Crazy News #4,
ZX Light #01,
Crazy News #5,
Playboy #02,
ZX News #03,
ZX Review #1-2,
Read Me #02,
Crazy News #3,
Nicron #13,
Read Me #01,
Public Spirit #01,
Faultless #06,
Faultless #05,
ZX Software #01,
Stump #04,
Speccy #07,
Возраждение #0,
Speccy #03,
On-Line #17,
Scene+ #01,
Welcome Press #01,
ZX Konig #04,
Adventurer #01,
Faultless #05,
Faultless #04,
Di Halt #01,
Faultless #01,
Playboy #01,
Crazy News #1,
Faultless #03,
Pioneer #03,
Sinclair Town #02,
ZX Magazine #01,
Eldorado #01,
ZX Magazine #02,
Spectron #01,
ZX News #01,
ZX Konig #02,
200 #W,
Welcome Press #00,
Dune #07,
Subliminal Extacy #01,
Subliminal Extacy #02,
ZX Konig #01,
Subliminal Extacy #00,
Muchomor #01,
Spectrofon #01,
ZX Revija #02,
Outlet #01,
Outlet #1-3