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.
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября