Из журнала ZX Format #5, Санкт-Петербург, 12.12.1996 MEMHELP (TALES OF CREATION). (C) KAMIKADZE O.B. FUCKSOFT ________________________________ Гордый вратник Сатаны Пролил кровь на свет И Священный Меч Войны Разрубил Секрет ... (KORROZIA METALLA 92) Программка "МЕМ" была написана по нескольким причинам: Во-первых : утомили всевоз- можные козлы, которые в следствии то ли собственной ог- раниченности, то ли убогости своих паталогов (а называть из- делия, которые не могут произо- дить полную дешифрацию адреса порта, словом "КОМПЬЮТЕР" - язык не поворачивается), упрямо вы- пускают на белый свет некие программные продукты, подчас вроде бы и неплохие, да в силу указания неполного адреса порта, не работающие на нормальных ма- шинах (PROFI SCORPION etc.), за коими, как известно, будущее синклер - совместимого рынка. Особенно удручают их "адаптации" уже известных программ под такую паталогическую дешифрацию. Ку- пишь программку за денежки кров- ные - а она не пашет... Злость, отнюдь не спортивная охватывает - так бы и дал в морду!!! Да где она, эта морда??? Уж много лет умные люди твердят: указывай ПОЛНЫЙ адрес порта!!! Да разве можно убедить идиота?.. Посему, идиотов просим обло- миться и не читать далее - все равно без толку. Лучше поиграйте в "PREVIEW"... Во-вторых : у вышеуказанных почетнных компьютеров наблюдает- ся несовместимость по портам и методам переключения страниц, когда речь заходит о памяти, большей, чем 128к. В-третьих : не у всех компьютеров одинаковой модели равное количество ОЗУ. У PROFI, например, бывают варианты 256к, 512к, 768к, 1М. Ходят байки о 512к SCORPIONе, который может быть появится в ближайшем време- ни... В-четвертых : страницы ОЗУ могут располагаться и не подряд: например у того же PROFI в базо- вой модели при 512к наблюдается такая странная картина физичес- кого расположения ОЗУ: сперва 256к ОЗУ (#0-#0F), затем дырка в 512к (#10-#2F), и, наконец еще 256к ОЗУ (#30-#3F), хотя бывает и подряд... В-пятых : на некоторых маши- нах, рассчитаных на большое ко- личество страниц, при подключе- нии НЕ ВСЕГО ОЗУ(например 512к вместо 1М) вылезает на свет та- кая паталогия, как пересечение страниц: обращаешься к одной, а подключается другая (или нес- колько других), либо одну стра- ницу можно вызвать по разным но- мерам, либо... Упаришься пере- числять. Хорошо это или плохо - вопрос спорный, но в плане безо- шибочного листания страниц - бе- зусловно отвратительно. Прихо- дится составлять карты ОЗУ, на- зывать физические страницы логи- ческими номерами, обращаться че- рез специальный (программный) диспетчер памяти... МРАК !!! В-шестых : в последнее время стали частенько появляться прог- раммы, ориентированные лишь на определенную машину: TASM256 (SCORPION), HONEY COMMANDER (ATM), MEGACOPY (PROFI), и мно- гие другие. То же и с игрухами. На этих компьютерах они ис- пользуют все их достоинства, но на других они не идут, или идут, но ущербно. А ведь все различие заключается в 99% случаев не в использовании дополнительных уникальных аппаратных особеннос- тей, а в прозаическом методе листания страниц, либо в их ко- личестве. Тем самым авторы этих программ (подчас весьма хороших и, что самое обидное, уни- кальных) теряют огромную часть своей потенциальной аудитории, и в следствии, авторитет и финан- совую выгоду. В-седьмых : наблюдается и обратная картина, не менее иди- отскя : авторы, желая "чтоб ра- ботала на всем", преднамеренно понижают уровень программ, ис- пользуя самый мизер и прижимая SCORPION или PROFI до уровня 128, а то и 48к. Понятно, что не всегда эти навороты нужны, но в противном случае чувствуешь себя оставленным в дураках: обладаешь мегабайтом памяти, а копируешь, используя 128к, т.е. вставляешь и вытаскиваешь диски (путаясь и яростно матерясь) 6 раз. Или, при имеющемся 256к SCORPIONе, жирная, графически навороченная игруха каждые 1-2 минуты начина- ет ерзать по диску, считывая по 16к файлы (а их может оказаться и 16 штук по 1к) на каждый уро- вень, а уровней, например 14. Трагикомедия... В-восьмых, в-девятых, в-де- сятых... Можно состариться, пе- речисляя, но не охватить и про- цента причин, а ведь разумеется, я все равно не смогу вспомнить их все. У тебя, небось, тоже не раз возникали дополнения к скорбному списку паталогий, пока ты читал сий пасквиль. Мораль сей басни такова : грамотно написанная программа обязана использовать по возмож- ности ВСЮ имеющуюся в наличии память компьютера, ежели это мо- жет повысить ее качество, удобство, быстродействие, объем данных. В некоторых случаях это, конечно вовсе не обязательно, но когда речь заходит, например, о копировщиках, базах данных, электронных дисках, оконных ин- тефейсах с сохранением, многоб- лочных игрухах и прочих прибам- басах, то максимальное использо- вание ВСЕЙ памяти - бесспорно и необходимо!!! И кроме того рабо- тать на других компьютерах, не гнушаясь ничего, даже 48к. Задачи на первый взгляд не- совместимые, но только на первый взгляд. Программа ДОЛЖНА САМА ОПРЕДЕЛЯТЬ какой компьютер, вы- яснять количество реально имею- щихся страниц ОЗУ их реальные адреса и метод их листания. Ведь согласитесь, вводить эти данные с клавиатуры каждый раз при за- пуске, либо инсталлировать с за- писью SETUPов на дистрибутивный диск (явно защищенный) с угрозой того, что при записи он загнет- ся, не хотелось бы никому, в том числе и потенциальным покупате- лям ваших программ. Как раз, именно этим и за- нимается моя программка с неза- тейливым названием МЕМ. Ис- пользуя ее в своих программах, вы можете добиться всего того, что я пожелал грамотным програм- мистам, знающим толк в удобстве работы с большими массивами па- мяти. Отдавая ее "на халяву" лю- бому пожелавшему, я надеюсь, что она принесет ему удобство и пользу, а юзеpам - неплохой SOFTWARE, за который не жалко будет заплатить кровные... Сама программка написана в виде набора подпрограмм в форма- те GENS4+ ( увы, увы - ради сок- ращения объема ее пришлось пе- регнать в TASM. прим.ред.). Опознает PROFI, SCORPION, SINCLAR 128, SINCLAIR 48. К со- жалению, не имея никаких данных по АТМ, я не смог включить его в этот список. Она была обкатана на таких машинах, как PROFI, SCORPION, PENTAGON, ZONA, 128к и 48к, а посему признана работос- пособной. Имеются несколько точек вхо- да, каждую из которых нужно рассмотреть в отдельности : CONF : производит опрос конфигурации компьютера. Возвра- щет в регистре А тип машины "s"- SINCLAIR 48, "S"SINCLAIR 128, "C"-SCORPION 256, "P"-PROFI и дублируя ее в переменной (CONF); в переменной (DELA) - количество страниц и таблицу их реального расположения, начинающуюся с TABL и заканчивающуюся байтом #FF. Если ты не собираешься вы- черкивать страницы либо перехо- дить в смешаный или 48 режим (см. ниже), то после выхода из этой процедуры все, что дальше этого байта #FF, более не приго- дится, а посему можно загружать туда все, что угодно и использо- вать эту область памяти по свое- му усмотрению. Если ты все же собираешься повычеркивать и(ли) посмешивать, то эта область ста- нет ненужной только после вычер- кивания и(или) смешивания. Сох- раняет все регистры кроме AF, но в своей работе использует по 1 байту из каждой страницы, с но- мером, указанном в метке POINT. Устанавливает после себя текущей страницу 7. Уничтожает себя в процессе работы, изменяя свое тело на переменные и таблицу страниц, посему второй раз не может быть вызвана (да это и не нужно). Также производит некото- рые изменения в теле процедуры LISTER, указывая на установлен- ный в процессе опознавания порт. Желательно запустить ее еще на стадии загрузки, чтоб ничего не повредила в страницах. ERASER : вычеркивание стра- ницы с физическим номером, поме- щенным в регистр А, из списка страниц ОЗУ и соответствующее уменьшение числа страниц в пере- менной (DELA). Имеет смысл в том случае, когда какие-либо страни- цы не собираешься листать, нап- ример 2 и 5. Тем самым они уда- ляются из таблицы и более не участвуют в процессе листания по логическим номерам (см. ниже). По окончанию вычеркивания всех ненужных страниц, сама становит- ся ненужной и может быть репрес- сирована в порядке, указанном в предыдущем абзаце. Сохраняет все регистры кроме AF. Можно запус- кать только после процедуры CONF. LISTER: производит листание по установленному порту в проце- дуре CONF и логическому номеру страницы, помещенному в регистр А. (Логический номер имеет смысл в том случае, когда не все в по- рядке с номером физическим, нап- ример когда некоторые страницы вычеркнуты или же при такой пи- кантной ситуации : обнаружены номера страниц #01...#0F, #30...#3F, и программисту куда удобнее называть их по порядку, т.е. #00...#1F, а не морочить себе голову замысловатой карти- ной физических номеров. В таком случае удобно указывать тот но- мер, который страница занимает в таблице страниц.) Возвращает в регистре А физический номер страницы и дублирует ее в пере- менной (MARK). Сохраняет все ре- гистры, кроме AF, игнорирует но- мера страниц, большие, чем было установленно. Эту процедуру мож- но запускать только после того, как конфигурация была установле- на процедурой CONF, иначе капут. (Имеет смысл напомнить, что во всех машинах, о которых идет речь, окромя PROFI с памятью, меньшей 1М, при невычеркнутых страницах логический и физичес- кий номера совпадают). PROFI листает физические стра- ницы PROFI по порту #DFFD, по номеру, помещенному в регистр А. Сохраняет все регистры. SCORP : то же самое для SCORPIONа порт #1FFD. S_128 : то же самое для SINCLAIR 128 порт #7FFD. UN128: Переводит паталог из 128 в смешаный режим, т.е. с 48 ПЗУ, но с открытым #7FFD-портом. Это бывает полезно, когда 128-я ПЗУ- ха совсем не в тему (а это почти всегда), но все же надо полис- тать. Старается сохранять все регистры, но включает 1 режим прерываний и разрешает их. После ее выполнения, если вернешься в BASIC, то увидишь не 128, а 48 редактор. В случае, если запуще- на из смешаного или 48 режимов - ничего не произойдет. После вы- полнения становится ненужной и может быть репрессирована. UN48 : Переводит паталог в 48 режим, т.е. закрывает защелку #7FFD порта. Листание обычным способом, естественно, становит- ся невозможным. (Я не имею в ви- ду особые способы, возможные, например на PROFI или SCORPIO- Nе). Сохраняет все регистры, но сама запускает UN128 со всеми вытекающими последствиями. После ее выполнения ВСЕ подпрограммы МЕМ становятся ненужными и зани- маемая ими память может ис- пользоваться по своему усмотре- нию. ПОДОБЬЕМ БАБКИ : (далее значок * означает адрес загрузки МЕМ) 1 - Процедуры : *+61 CONF : определение конфигу- рации и установка порта. *+337 ERASER : вычеркивание страницы из таблицы. *+38 LISTER : листание логичес- ких страниц по установленному порту. * PROFI \ листание физичес- *+12 SCORP - ких страниц по со- *+24 S_128 / ответствующему порту. *+367 UN128 : перевод паталога в смешаный режим. *+429 UN48 : перевод паталога в 48 режим. 2 - Переменные : *+61 CONF: установленная конфи- гурация : "s" - SINCLAIR 48 "S" - SINCLAIR 128 "C" - SCORPION 256 "P" - PROFI *+62 DELA количество опознаных страниц. *+63 TABL: начало таблицы стра- ниц. MARK : копия физического номера текущей страницы. По умолчанию #5B5C, что соответствует пере- менной 128к BASIC BANKM. POINT : адрес байта опознания страницы (его содержимое погиба- ет). По умолчанию #FFFF, т.е. последний. Совет тем, кто недопонял: на стадии загрузки нужно загрузить МЕМ, смешать (желательно) с по- мощью UN128, запустить CONF, за- тем вычеркнуть ненужные страницы с помощью ERASER, после чего не- обходимым останется лишь кусок с длиной в 64 байта + количество страниц. (Максимальная длина - в случае PROFI 1M с невычеркнутыми страницами = 128 байт). Для пе- ревода в 48 режим достаточно просто запустить UN48. Потом можно грузить, запускать, лис- тать (если не защелкнул) и т.д. Переменные MARK и POINT мож- но установить любые, какие больше по душе придутся, но ос- мелюсь напомнить, что POINT должна быть в интервале #C000...#FFFF, а MARK - как раз наоборот, не должна. Также, не сочтите за ос- корбление просьбу располагать сию программку не в листаемых страницах и по возможности не листать 2 и 5 страницы, а также помнить, что нумерация страниц (как физических, так и логичес- ких) начинается с 0, т.е пере- листнуть можно только страницу с номером меньшим, чем в перемен- ной (DELA) и уж тем паче не лис- тать страниц на 48к машине (т.к. порт листания на ней не устанав- ливается, таблица страниц не составляется и паталог сбросит- ся). Кстати, сия программка не отличит KAY 256 от SCORPIONа, т.к. у нее только одна задача - память. А у SCORPIONa полезно вычеркнуть 8 страницу во избежа- ние обломов с RST8. И ежели все это будет соблю- дено, то можете смело варганить программку, включая в нее МЕМ кусок, и листать страницы любого компьютера, не заботясь ни о чем, и программки ваши будут зе- ло красотою лепы, и радовать бу- дут мое жестокое сердце... ЧАО... (KAMIKADZE O.B.) = FORWARD TO FULL DARKNESS !!! = ZF> сама прога лежит в приложе- нии, в формате TASM4 (XLD). ZF> Сразу хочу заявить, что за последствия работы вышепри- ведённой програмки ответа надо требовать с её автора. А у меня сия штучка всё ещё вызывает странные сомнения... :(. Для заинтересовавшихся же данной темой в Обмене опытом найдётся ещё одна программка на данную тему, кстати, понимающая больше типов компов... ________________________________ ORG 30000 POINT EQU #FFFF ;POINT OF CHECKING MARK EQU #5B5C ;BANKM,COPY OF PAGENUM. PROFI PUSH BC,AF RRCA RRCA RRCA AND 7 LD BC,#DFFD JR LOM SCORP PUSH BC,AF RLCA AND 16 LD BC,#1FFD LOM OUT (C),A NOP POP AF,BC S_128 PUSH BC,AF AND 7 OR 16 LD BC,#7FFD OUT (C),A NOP POP AF,BC RET ;RETURN TO THE WORLD LISTER PUSH HL,BC ;LOGIC LISTER LD HL,DELA ;MAX NUMBER OF PAGES CP (HL) JR NC,KLOP INC HL LD C,A LD B,0 ADD HL,BC LD A,(HL) ;PHYSICAL PAGE LD (MARK),A ;COPY OF PAGE PAPA CALL 0 ;LOGIC LISTER KLOP POP BC,HL RET ;RETURN TO THE WORLD CONF PUSH HL ;CONFIGURATION DELA PUSH BC ;TOTAL NUMBER OF PAGES TABL JR LULI ;BEGIN ADDR. OF PAGEMAP SINC DB 0,1,3,4,6,7,8,9,10,11,12,13,14,15 LULI LD B,6 ;SPECTRUM 48 ??? LD HL,SINC LUST LD A,(HL) ;FILLING CALL S_128 LD (POINT),A INC HL DJNZ LUST LD B,6 ;CHECKING LD HL,SINC SLUT LD A,(HL) CALL S_128 LD A,(POINT) CP (HL) JR NZ,S_48 INC HL DJNZ SLUT JR SCOT S_48 LD A,0 ;IT'S A SPECTRUM 48 LD (DELA),A LD BC,0 LD A,"s" JP LISP SCOT LD B,13 ;SCORPION ??? LD HL,SINC LOOP LD A,(HL) ;FILLING CALL SCORP LD (POINT),A INC HL DJNZ LOOP LD B,13 ;CHECKING LD HL,SINC POOL LD A,(HL) CALL SCORP LD A,(POINT) CP (HL) JR NZ,PROT INC HL DJNZ POOL LD A,7 ;IT'S A SCORPION CALL SCORP LD A,16 LD (DELA),A CALL NASA LD BC,SCORP LD A,"C" JP LISP PROT LD A,16 ;CREATE MEM MAP LD HL,LULI KULE LD (HL),A INC HL INC A CP 64 JR NZ,KULE LD A,62 LD (DELA),A LD HL,SINC+61 ;FILLING LD B,62 BRAKE LD A,(HL) CALL PROFI LD (POINT),A DEC HL DJNZ BRAKE LD HL,SINC ;CHECKING LD B,62 SRAKE LD A,(HL) CALL PROFI LD A,(POINT) CP (HL) JR Z,MURGU LD (HL),#FF LD A,(DELA) DEC A LD (DELA),A MURGU INC HL DJNZ SRAKE LD A,(DELA) ;SPECTRUM 128 ??? CP 9 JR NC,PROP LD A,7 ;IT'S A SPECTRUM 128 CALL PROFI CALL NASA LD BC,S_128 LD A,"S" JR LISP PROP LD HL,DELA ;IT'S THE PROFI INC (HL) INC (HL) LD HL,TABL LD BC,SINC+4 ;MOVING THE MAP LD A,0 KOK LD (HL),A INC HL INC A CP 6 JR NZ,KOK LD A,58 SONY PUSH AF LD A,(BC) CP #FF JR Z,KAL LD (HL),A INC HL KAL INC BC POP AF DEC A JR NZ,SONY LD (HL),#FF LD A,7 CALL PROFI LD BC,PROFI LD A,"P" LISP LD (PAPA+1),BC;END OF RECOGNIZING POP BC,HL LD (CONF),A RET ;RETURN TO THE WORLD NASA LD HL,TABL ;TABLE FOR SINCL&SCORP LD A,(DELA) LD B,A LD A,0 BEER LD (HL),A INC HL INC A CP B JR C,BEER LD (HL),#FF RET ERASER PUSH HL,BC,DE ;ERASING THE PAGE LD HL,DELA LD C,(HL) LD B,0 LD HL,TABL CPIR JR NZ,DUDE LD D,H LD E,L DEC DE INC BC LDIR LD HL,DELA DEC (HL) DUDE POP DE,BC,HL RET ;RETURN TO THE WORLD UN128 LD HL,#2762 ; 128 -> 48' EXX LD HL,4867 PUSH HL LD (23613),SP ; ERROR SUBR LD HL,(23631) LD DE,15 ADD HL,DE LD DE,5566 EX DE,HL LD BC,4 LDIR LD IY,#5C3A RES 4,(IY+1) IM 1 EI HALT JP 7030 UN48 CALL UN128 ; 48' -> 48 LD A,(#5B5C) OR #30 LD BC,#7FFD OUT (C),A NOP RET