ZX Spectrum
Game

Streams and Channels

ZX Computing (Великобритания),

Автор:

Жанр: Программы и утилиты


Язык

  • Русский
  • English

Управление

  • Клавиатура(?)

Игроков

  • Один

Доступные версии

Неофициальное издание
Играть!

Доступные версии

Неофициальное издание
Играть!
  •  Описание (авт.пер.)
  •  Описание (авт.пер.)
  •  Описание (авт.пер.)
  •  Описание (авт.пер.)
  •  Описание (авт.пер.)
  •  Информация
Описание Streams and Channels (автоматический перевод)

1 2 3 4 5 6 7 8

ВОДОТОКИ И КАНАЛЫ

Тони Бейкер часть 1 из 5, ZX Computing декабря 1986

Потоки и каналов может звучать как компьютерном жаргоне, но если

вы можете освоить их можно контролировать некоторые мощные новые средства.

[Обратите внимание, что код в STREAMS.TAP “часть3”, “PART4” и “part5”] [Включает в себя код из предыдущей части. JimG]

Всякий раз, когда мы что-то напечатать, или введите то, что мы делаем использование

ручьи и каналы. PRINT действительно означает PRINT # 2, хотя # 2 часто опускается. Точно так же, INPUT на самом деле означает Input # 0, и LPRINT означает PRINT # 3. После символа “#” число называется STREAM НОМЕР.

Теперь, не каждый номер потока может использоваться. Если, после включения

Спектр, вы тип печати # 6, вы получите сообщение об ошибке “О Invalid поток “. Это потому, что поток номер 6 не подключен к каналу, поэтому, прежде чем я что-либо сделать, я бы лучше объяснить, что канал.

Канал устройство используется либо для ввода или вывода (или

и) байт данных. Экран телевизора представляет собой канал, так как персонажи могут быть напечатан на ней. Каждый канал имеет имя, состоящее из одного буква алфавита. Экран называется канал “S”, потому что “S” выступает за экран. ОТКРЫТОЕ # заявление используется для подключения канала к поток, так что если вы наберете в BASIC заявлении ОТКРЫТОЕ # 6, “S”, то из Теперь, всякий раз, когда вы используете PRINT # 6; Выход будет печататься на Экран.

Аналогично, клавиатура это устройство, используемое для ввода, поэтому

Слишком является каналом. Он имеет название – “K” для клавиатуры. Вы можете прикрепить Поток к клавиатуре так же легко, как на экран: ОТКРЫТЫЙ #N, “К” прикрепит номер поток N к клавиатуре. Вы можете иметь максимум шестнадцать потоков в целом, и они пронумерованы от нуля до пятнадцать. Там нет такого понятия, как число поток шестнадцать, и, если вам пытайтесь использовать его, то вы получите сообщение об ошибке. Потоки ноль три, однако, уже говорил за. Поток нулю и поток один являются как крепится к каналу “К” (клавиатуры), поток двух придается Канал “S” (экран), и поток три прилагается к каналу “P” (Принтер).

Каналы “S” и “P” можно использовать только для производства, так PRINT # 2; является

разрешено, но ВХОД # 2; нет. Удивительно, хотя, канал «К» может быть используется либо для ввода или для вывода. ВХОД # 0; так же, как обычный заявление ВХОД, но PRINT # 0 будет печатать на нижний две линии экрана (где обычно появляется ввод текста). Если вас следовать PRINT # 0; Заявление с паузы 0, например, то вы будете увидеть этот эффект в действии.

КАНАЛ “P”

Канал “P” является странным один. На версиях 16К и 48К от

Спектр, а также на Spectrum 128 в режиме 48К, канал “Р” является ZX Printer. На Spectrum 128 в режиме 128К, однако, канал “Р” является встроенный разъем RS232, в котором вы можете подключить совместимое Принтер, другой компьютер, или что-нибудь еще вам хочется.

Кстати на Spectrum 128 в 128К режиме вы также можете ввести с Канал “P”. Это просто означает, что компьютер может принимать данные от его порт RS232, что означает, что два компьютера может эффективно говорить с друг с другом с помощью этой ссылки. Это не возможно, чтобы напечатать к типу ZX Принтер с 128 в 128К режиме, по крайней мере, не в основной, но это где эта серия выпускается в.

Если вы подключили интерфейс ZX One тогда будет другой каналы тоже. Канал “М” – в микродрайвы; Канал “N” – сеть; Каналы “T” и “B” – порт RS232 один интерфейс (как противоположный к порту RS232 спектра 128 в).

Это, то, заключает список стандартных каналов, доступных на

Спектр, но использование каналов сделать что-нибудь еще более обширно недооцененный. Это четыре части [На самом деле из пяти частей. JimG] серия посвящена изменения все такое. Это цель этой серии к исследовать странные новые методы программирования, искать новые каналы и новая информация, смело разделить инфинитивов которые поток не имеет разделить раньше.

Мы должны придумать, в машинный код, новых каналов, которые могут печатать на

Экран в больших или маленьких букв; новые каналы, которые позволят Использование окна на экране (а-ля QL); новые каналы, которые позволяют полностью успешными связь между спектры и QLS над сеть; новые каналы, которые позволяют принтера ZX работать на Спектр 128 в режиме 128К; новые каналы, которые позволят пользователям Спектр 128, чтобы использовать читать и записывать файлы в RAM-диска.

C.I.A.

Так как же все это работает? Хорошо, что это вопрос, который я намерен ответить

в этой статье. Это все зависит от области памяти, что вы, вероятно, не использовали раньше, называется “Channel Информационный центр», и который случается, расположенный непосредственно под BASIC программной области. К создать канал, который вы просто должны организовать память в канале Информация площадь в правильный путь, и, конечно, обеспечить машинный код для осуществления печати и входной и из канала. Вот как это работает.

Каждый канал должен иметь “информацию о каналах Block”, хранящейся в канал информационного пространства. Это просто кусок памяти, посвященный на канал, содержащий все его системных переменных и Адреса входных и выходных подпрограмм. Три первичных Каналы “К”, “S” и “P” все используют только пять байтов, но они исключения. Все другие каналы требуют, как минимум, одиннадцать байтов, как мы увидим.

Между прочим, существует четвертая первичный канал (то есть, канал

доступно на нерасширенного стандартного спектра) называется канал “R”, но он доступен только в машинный код. Мы узнаем об этом позже.

Информационные канал блоки для этих четырех основных каналов смотреть

как это:

Байты 0 и 1: Адрес PRINT # рутины.

Байты 2 и 3: Адрес ВХОД # рутины.

Байт 4: Название канала (ASCII код символа).

Интерфейс Один каналы все нужно минимум одиннадцать байтов, и

их канал информация адресуется регистр IX. Их информационные канал блоки выглядеть так:

IX + 00 (2 байта): адрес 0008.

IX + 02 (2 байта): адрес 0008.

IX + 04: Название канала (ASCII код символа).

IX + 05 (2 байта): Адрес PRINT # рутины (в Shadow ROM).

IX + 07 (2 байта): Адрес ВХОД # рутины (в Shadow ROM).

IX + 09 (2 байта): Длина информационного канала блока (минимум 0008). IX + 0B: Любая дополнительная информация.

ROM ROUTINES

Стандартные печати и входной подпрограммы в ПЗУ (RST 10 и ВЫЗОВ

15E6, INPUT_AD) будет “ожидать” первичный канал. Таким образом, контроль будет прыгать по адресу, указанному на байт 0 и 1 (для RST 10), или на адрес задается байт 2 и 3 (для INPUT_AD). В случае Интерфейс Один каналов, этот адрес будет в обоих случаях будет 0008. В этот адрес Shadow ПЗУ выгружен в и рутина в тени ROM будет перенаправлять контроль по адресу, указанному на (IX + 05/06) или (IX + 07/08).

Наши каналы будут выглядеть по-разному снова. Мы тоже будем использовать IX в индексе

канал информации, однако наши каналы будут выглядеть следующим образом:

IX + 00 (2 байта): Адрес PRINT # рутины.

IX + 02 (2 байта): Адрес ВХОД # рутины.

IX + 04: Название канала (ASCII код символа).

IX + 05 (2 байта): 1234 Число, которое идентифицирует это как пользователь определяется канал.

IX + 07 (2 байта): Адрес ЗАКРЫТЬ # рутины.

IX + 09 (2 байта): Длина информационного канала блока (минимум 0008). IX + 0B: Любая дополнительная информация.

STREAMS тоже важны

Вы видите, каждый поток имеет свой собственный уникальный системную переменную двухбайтовое.

STRMS_00 находится в 5C16, STRMS_01 находится в 5C18, и так далее. Кроме того там три потоки, которые доступны в машинный код, но не в BASIC. Это поток ФО, поток FE, и поток FF. У них тоже есть системные переменные. STRMS_FD будет в 5C10, STRMS_FE находится в 5C12, и STRMS_FF находится в 5C14. Поток FD постоянно прикреплена к каналу “К” и не должны быть изменены. Точно так же, поток FE постоянно прилагается к каналу “S”.

Поток FF интересно. Он постоянно прикреплены к каналу “R” –

Внутренний канал машинный код, который способен вставки байтов в динамической компоновки памяти спектра в. Мы будем использовать этот оснащены позже.

В STRMS переменные сами связать поток в канале. Если

Переменная STRMS для любого конкретного потока содержит 0000, то это означает, что поток идет речь закрыт (т.е.. он не имеет канал, прикрепленный к нему). Если переменная не равна нулю, то поток прикреплен к канал. В частности он присоединен к каналу которого канал Информационный блок начинается с адреса (CHANS) + (STRMS_n) -1.

Выходит, таким образом, что она должна, безусловно, будет легче, от машины

Код точка зрения, чтобы открыть канал, чем закрыть его, так как, чтобы открыть Канал все, что вам нужно сделать, это, чтобы освободить место для нового канала информация в конце области чаны, и назначить необходимости переменная STRMS прикрепить поток в. Закрытие таких канал, с другой стороны, может быть более сложным, потому что, если информационный канал блок не последний в области Чаны то все канальных блоков информации, которые следуют ему придется [быть перемещается] вниз в памяти, который в свою очередь означает, что соответствующий Переменная STRMS должны быть соответствующим образом изменена. Любые или все STRMS переменные могут должны быть изменены, если это имеет место.

CLOSE_A

Основная программа сопутствующих эту статью называют CLOSE_A [Но

игнорировать его, как это “пронизана ошибками”, по словам автора (см Следующий выпуск). JimG]. Его целью является, чтобы закрыть одну из наших новых каналов. На входе регистр должен содержать номер потока должны быть закрыты. Если поток уже закрыт, или, если канал не является одним из наших пользовательские те, то подпрограмма вернет, сделав ничего. Если, с другой стороны, поток указано прикреплен к один из наших новых каналов, то процедура будет закрыть канал, вернуть память, используемую этого канала, и настроить любой из STRMS Переменные требуется. Флаг переноса также должен быть указан на въезд. Если флаг переноса устанавливается это означает, что любые данные, хранящиеся в буферах должны быть разосланы, но если флаг переноса сбрасывается это означает, что любые такие данные будет игнорироваться.

Также имеется программа CLEAR_CHANS который закроет все такое пользователя

определенные каналы. Любые данные, хранящиеся в буферах будут потеряны, если это подпрограмма вызывается.

Вы можете думать, это странное начиная с ЗАКРЫТЬ # рутины, в то время как не

имеющий открытый # рутину, но вот где скалы вешалка приходит в. В следующем месяце я начну открывать новые каналы – в частности, я буду дело с печатью на экран в больших или маленьких букв. Запомнить что, как только открывается канал может быть использован по желанию в BASIC. Как только как у вас есть канал, который можно распечатать шестьдесят четыре символа всей экран, то вы можете использовать общий или дачи BASIC оператор печати печатать вещи к каналу.

Изучите программы я перечислил. Они не являются перемещаемыми, потому что они

предназначены для ссылки на все другие биты программы, которые Вы получите в течение ближайших трех эпизодов. Если вы до сих пор не должным образом понимать понятия каналов или потоков, то, может быть, в следующем месяце Вы будете намного мудрее, когда я начну давать вам некоторые конкретные примеры идей в использовании.

Увидимся.

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

Листинг 1

B000 08 CLOSE_A EX AF, AF ‘; магазин флаг переноса

B001 CD2117 ЗВОНОК STR_DATA_A; HL указывает на STRMS данные B004 78 LD A, B B005 B1 ИЛИ С B006 C8 RET Z; Возврат, если поток уже закрыт B007 E5 PUSH HL; Стек указатель STRMS данные B008 21E2A3 LD HL, # A3E2 B00B 09 ДОБАВИТЬ HL, BC B00C E1 POP HL; HL указывает на STRMS данные B00D D0 RET NC; Возврат, если канал K, S, R или P B00E DD2A4F5C LD IX, (CHANS) B012 DD09 ДОБАВИТЬ IX, BC B014 DD2B декабря IX; IX указывает на канале данные B016 DD7E05 LD, (IX + # 05) B019 FE34 CP # 34 B01B C0 RET NZ; Возврат если не канал определяется пользователем B01C DD7E06 LD, (IX + # 06) B01F FE12 CP # 12 B021 C0 RET NZ; Возврат если не канал определяется пользователем B022 3600 LD (HL), # 00 B024 23 INC HL B025 3600 LD (HL), # 00; Нагрузка STRMS данные с 0000 до                                            ; Сигнал “поток закрыт” B027 C5 PUSH BC; Стек CHANS смещение B028 DD6E07 LD L, (IX + # 07) B02B DD6608 LD H, (IX + # 08); HL = адрес ЗАКРЫТЬ # рутины B02E 08 EX AF, AF ‘ B02F DC2C16 ЗВОНОК С, CALL_JUMP; Вызов подпрограммы при необходимости B032 DDE5 PUSH IX B034 E1 POP HL; HL = адрес информации канала B035 DD4E09 LD C, (IX + # 09) B038 DD460A LD B, (IX + # 0A); BC = длина информации канала B03B C5 PUSH BC; длина Стек информации канала B03C CDE819 ЗВОНОК RECLAIM_2; Исправьте память используется канал B03F 3E10 LD A, # 10; = количество потоков B041 21165C LD HL, # 5C16; HL указывает на STRMS данные для потока 0 B044 22745C C_LOOP LD (T_ADDR), HL; магазин STRMS указатель B047 5E LD E, (HL) B048 23 INC HL B049 56 LD D, (HL); DE = STRMS данные для потока А B04A C1 POP BC; BC = длина информации канала мелиорированных B04B E1 POP HL; HL = CHANS Индик.точки. канала закрыт B04C E5 PUSH HL B04D C5 PUSH BC B04E A7 И B04F ED52 SBC HL, DE B051 300B JR NC, C_CONT; Перейти если канал информации для потока А                                            ; Переехал B053 EB EX DE, HL; HL = STRMS данных для потока А B054 A7 И B055 ED42 SBC HL, BC; Снизить для обеспечения мелиорированных земель 057 EB EX DE, HL; DE = измененные данные STRMS B058 2A745C LD HL, (T_ADDR); HL указывает на STRMS данные B05B 73 LD (HL), E B05C 23 INC HL B05D 72 LD (HL), D; магазин изменены данные B05E 2A745C C_CONT LD HL, (T_ADDR); HL указывает на STRMS данные B061 23 INC HL B062 23 INC HL; HL указывает на следующей переменной STRMS B063 3D декабря B064 20DE JR NZ, C_LOOP; Повторите для всех шестнадцати потоков B066 F1 POP AF B067 F1 POP AF; Баланс стека B068 C9 RET – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

В листинге 2

B069 3E10 CLEARCHAN LD A, # 10; = количество потоков

B06B 3D CC_LOOP декабря; = следующий номер потока B06C F5 PUSH AF; Стек номер потока и нулевой флаг B06D A7 И; Сброс нести, чтобы сигнализировать                                            ; “Не отправлять данные” B06E CD00B0 ЗВОНОК CLOSE_A; Закрыть поток, если это                                            ; Определяется пользователем поток B071 F1 POP AF; = текущий номер поток B072 20F7 JR NZ, CC_LOOP; Повторите для всех потоков B074 C9 RET

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

Описание Streams and Channels (автоматический перевод)

1 2 3 4 5 6 7 8

ВОДОТОКИ И КАНАЛЫ

Тони Бейкер часть 2 из 5, ZX Computing января 1987

Тони Бейкер проливает свет на окнах для всех спектров.

В последней части мы обсуждали то, что потоки и каналы были и что

мы могли бы сделать с ними. Кроме того, мы ввели понятие “User Defined Каналы “- то есть – новые каналы, созданные в машинный код, чтобы сделать Различные задачи невозможно в любой другой форме. Эпизод в прошлом месяце включены программы, чтобы закрыть канал определяется пользователем. Извинения за здесь, как, к сожалению, она была пронизана ошибками, так я перечислил новый версия в этом эпизоде. Вы хотели бы играть “Найди ошибки” по Сравнивая список в прошлом месяце, чтобы в этом месяце – посмотреть, сколько вы можете найти! Включенный версия работает, однако, так же как и остальные Программа.

Windows

Эта статья состоит из нового пользователя, заданный канал называется окном.

Понятие окна очень просто. Пользователи КЖ будет уже быть знакомы с ними. Окно представляет собой прямоугольную область экрана которые могут рассматриваться как если бы он был весь экран – если вы печатаете текст к окну оно появится только в пределах этого прямоугольника, и как только окно получает полностью заполнен он будет прокручивать независимо в остальной части экрана. Возможно также, чтобы очистить окно, в любой цветовой гамме, не очищая остальной части экрана.

Программа дано будет фактически обслужить двух различных типов

Окно, который я назвал “Быстрый” и “медленный” окна (хотя в практика, похоже, нет заметной разницы в скорости между два). Окно “Быстрый” будет делать именно то, что описано выше, и не более. Стандартный набор символов используется (хотя это может быть изменить путем изменения системной переменной (символы) в адрес 5C36) и все символы восемь пикселей в ширину.

Окно “Slow”, однако, имеет два важных дополнительных услуг. Во-первых, левой обоснование. Проще говоря это означает, что слова трактуются как целые куски символов и не будут разделены – таким образом, если слово слишком длинное и не помещается в конце одной строки, то он будет напечатан, как Весь в начале следующей строки. Это достигается за счет умело хранения всех символов в буфере до конца слова не является достигли, а затем решить, будет ли она соответствовать на линии.

Это означает, что когда вы используете медленный канал окна вы никогда не должны беспокоиться о интервал слова, чтобы поместиться на линии – канал делает, что все само по себе.

Второе улучшение в том, что вы не ограничены в восемь бит

широкие символы – вы можете использовать семь битный; шесть битный; четыре бита Широкий даже если вам нравится. Это означает, что вы можете поместить больше символов в каждая линия, чем, как правило, это возможно.

Когда окно заполняется тогда он будет прокручивать. Обычно это будет

Остановимся на этом пункте, но это возможно, чтобы открыть окно, которое имеет прокрутки пауза отключена – в таком случае окно будет прокручиваться автоматически каждый раз, не останавливаясь, чтобы ждать тебя. В то время как Окно паузы появится экран заморозить. Затем вы можете нажать либо пространство (которое продолжается со свитком) или BREAK (который будет вспыхнуть давая сообщение с отчетом “D ПЕРЕРЫВ – CONT повторы”). Даже если прокрутки пауза отключена она по-прежнему можно будет вырваться на точка прокрутки, нажав BREAK.

Спектр, в отличие от QL, не оснащены заявлении

CLS #N (который очищает окно), так что я должен был сделать специальное предоставление для того, чтобы окно может быть легко очищена от BASIC. Я использовали CHR $ 0 в качестве контроля четко окно, таким образом, чтобы очистить окно прилагается к потоку четыре было бы просто необходимо использовать Команда: PRINT # 4; CHR $ 0; и работа будет сделана. Вы можете поставить другой печать элементы на одной линии в процессе. Все нормальные управления являются разрешено, в том числе AT и TAB, все элементы управления цветом (бумага, тушь, FLASH и BRIGHT), а также обратный. OVER не включены, Однако, при использовании медленных окон. OVER 1 переключится на печать с персонажами двойной высоты, в то время как OVER 0 вернется к печати с одно- символов высоты.

Как было сказано в предыдущей статье, все наше нового пользователя определяется

каналы будут определены тем, что IX + 05 будет содержать двухбайтовое значение 1234h, где IX указывает на канале информации блок. Рисунок один список информации канала, используемого окна канал. Обратите внимание, что если окно быстрого окно то W_SCROLLS (IX + 15) будет последняя переменная – IX + 16 и за ее пределами, не будет существовать.

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

Рисунок 1

IX + 00 W_OUT Адрес выходного окно рутины (= B4F1)

IX + 02 W_IN Адрес выходного окно рутины (= 15C4, REPORT_J) IX + 04 W_CHNAME Название канала (= “W”) IX + 05 W_IDEN Новый идентификатор канала (= 1234) IX + 07 W_CLOSE Адрес пустой рутины буфера                   (= B4D6 для медленных окон или 0052 для быстрого окон) IX + 09 W_CHLEN Длина информационного блока канала IX + 0B W_FLAGS Различные флаги, определяется следующим образом:        Бит 7: Сброс, если ведущий пространство требуется, установите в противном случае        Бит 6: Не используется        Бит 5: Установите, если включен прокрутки пауза, сброс в противном случае        Бит 4: Набор для медленного окна, сброс для быстрого окне        Бит 3: Набор для INVERSE 1, сбросить за INVERSE 0        Бит 2: Установите при помощи двойной высоты, сброс в противном случае        Биты 1,0: Количество контрольных параметров требуется IX + 0C W_XCOORD Текущие координаты х положение печати IX + 0D W_WIDTH Количество символов в строке IX + 0Е W_YCOORD Текущий координату позиции печати IX + 0F W_HEIGHT Высота окна, на площадях IX + 10 W_PRPOS Адрес в экране текущей позиции печати IX + 12 W_HOME Адрес в экране верхнем левом углу окна IX + 14 W_ATTR Цвета в настоящее время используется для окна IX + 15 W_SCROLLS Считает количество свитков допускается до прокрутки пауза, +1 IX + 16 W_PIX Должность в квадрате текущей позиции печати IX + 17 W_CH_WID Ширина символов в пикселях IX + 18 W_CHARS Адрес набора символов (20-7F) минус 100h IX + 1А W_UDG Адрес набор символов (80-A4) IX + 1С W_WIDTH_8 Ширина окна, на площадях IX + 1D W_LEN Количество символов хранится в буфере IX + 1E W_BUFFER Сам буфер – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

UDGs

Программа начинается с нескольких подпрограмм, пригодных для всех пользователей

определенные каналы, а не только окна. В адресной B000 рутинной CLOSE_NEW закроет новый канал, который прикреплен к потоку А. В Адрес B061 является рутинной, который закроет все пользовательские каналы, но любые данные, хранящиеся в буферах будут потеряны, если используется эта рутина. В адрес B06D процедура OPEN_NEW будет открыть любой новый пользователь, определенный канал и приложите его к потоку. Для использования этой суб-распорядке регистры должны быть предварительно назначены с требуемыми значениями, как указано в вышеупомянутых рутины нот.

Тогда есть несколько подпрограмм, которые будут работать с большей пользователь

определенные каналы, хотя и не обязательно все из них. CHR_TYPE (Адрес B0B7) будет расширяться ключевые слова, и будет считать входной контроль Параметры. Она также будет установить или переустановить “Ведущий Space” немного (см Рисунок Один) по поводу того, не в характере это пространство. Если, по возвращении из этой югу рутины флаг знак установлен, это означает, что нет больше работы предстоит сделать для этого персонажа. CHR_TYPE_2 (Адрес B12F) будет также иметь дело с контролем запятыми и TAB Функция, и таким же образом, будут также возвращать с флагом знак устанавливается, если работа по характеру закончена.

И тут мы подходим к самой программе. Программа будет работать как на

16К / 48К Спектры и на Spectrum 128, в любом режиме – но когда Программа запускается на Spectrum 128 в режиме 128К, то это будет можно определить окно либо на экране нулевой (нормальный экран) или экран один. Обратите внимание, что Spectrum 128 не имеет встроенного программного обеспечения которые могут печатать на экране одного, так что эта программа сделает за одного из немногих недостатков в новой машине. Пользователи спектра 128 сусла убедитесь, что стопка машина находится ниже адрес BFFF иначе программа даст сбой.

Чтобы открыть окно на экране одного надо только установить бит 7

В регистр (координата окна) при открытии канал.

Вот как вы открываете окно канала. Во-первых, вы должны назначить

регистры, определенные в вышеуказанных OPEN_WINDOW (адрес B212) нот, а затем все, что вам нужно сделать, это вызвать подпрограмму OPEN_WINDOW Сама. Вуаля, работа будет сделана, и вы можете использовать канал в ОСНОВНЫЕ так же легко (если не проще), как вы можете в машинный код.

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

Листинг 1

Чтобы закрыть новый канал. На входе регистр должен содержать номер потока

должны быть закрыты. Если вызывается из этикеток CLOSE_CLR то флаг Carry должен быть устанавливается, если данные в буферах должно быть отправлено, или сброс, если такие данные будут потеряны.

B000 37 CLOSE_NEW SCF; Сигнал “Данные в буфере для отправки”

B001 F5 CLOSE_CLR PUSH AF; Стек номер потока B002 08 EX AF, AF ‘; F’ сохраняет флаг Carry B003 F1 POP AF; число = поток закрыть B004 CD2117 ЗВОНОК STR_DATA_A; BC = поток данных для данного потока;                                            ; HL указывает на соответствующий STRMS вар B007 E5 PUSH HL; указатель стека на STRMS переменная B008 21EBFF LD HL, # FFEB; HL = -15h B00B 09 ДОБАВИТЬ HL, BC B00C E1 POP HL; HL указывает на STRMS переменную B00D D0 RET NC; Возвращение с каналами “К”, “S”, “R”                                            И “P”, а также с потоками, которые                                            ; Уже закрыты B00E DD2A4F5C LD IX, (CHANS); IX указывает на канал инфо область B012 DD09 ДОБАВИТЬ IX, BC B014 DD2B декабря IX; IX указывает на канале информации                                            ; Блокировать для данного канала B016 DD7E05 LD, (IX + # 05) B019 FE34 CP # 34 B01B C0 RET NZ B01C DD7E06 LD, (IX + # 06) B01F FE12 CP # 12 B021 C0 RET NZ; Возврат, если это не один из наших новых                                            ; пользовательские каналы B022 3600 LD (HL), # 00 B024 23 INC HL B025 3600 LD (HL), # 00; Сброс переменной STRMS, таким образом,                                            ; Закрытии потока B027 C5 PUSH BC; Stack смещение в канале                                            ; Информация область B028 DD6E07 LD L, (IX + # 07) B02B DD6608 LD H, (IX + # 08); HL = адрес “Отправить данные в буфере”                                            ; Подпрограмма B02E 08 EX AF, AF ‘; Получить флага переноса B02F DC2C16 ЗВОНОК С, CALL_JUMP; Передача данных при необходимости B032 DDE5 PUSH IX B034 E1 POP HL; точки HL для канала инфо блок B035 DD4E09 LD C, (IX + # 09) B038 DD460A LD B, (IX + # 0A); BC = длина инфо блока канала B03B C5 PUSH BC B03C CDE819 ЗВОНОК RECLAIM_2; освободить память, используемую блоком B03F C1 POP BC B040 3E10 LD A, # 10; = количество потоков, чтобы рассмотреть B042 21165C LD HL, STRMS_00; HL указывает на поток нулевой переменной B045 5E CLOSELOOP LD E, (HL) B046 23 INC HL B047 56 LD D, (HL); DE = переменная поток для следующего потока B048 E3 EX (SP), HL; HL = переменная поток для потока                                            ; Просто закрыты B049 A7 И B04A ED52 SBC HL, DE B04C 19 ДОБАВИТЬ HL, DE B04D 300B JR NC, CLOSENEXT; Перейти если информация о канале                                            ; Блок для этого потока переехал B04F EB EX DE, HL B050 A7 И B051 ED42 SBC HL, BC B053 EB EX DE, HL; DE = обновляются переменная поток для                                            ; Этот поток B054 E3 EX (SP), HL; HL указывает на второго байта STRMS вар B055 2B декабря HL; HL указывает на первый байт STRMS вар B056 73 LD (HL), E 057 23 INC HL B058 72 LD (HL), D; магазин новое значение переменной потоков B059 Е3 EX (SP), HL B05A E3 CLOSENEXT EX (SP), HL; HL указывает на вторую байта STRMS вар B05B 23 INC HL; HL указывает на следующей переменной STRMS B05C 3D декабря B05D 20E6 JR NZ, CLOSELOOP; Loop назад рассмотреть остальные                                            ; потоки B05F F1 POP AF; Баланс стека B060 C9 RET; возврат

Чтобы очистить все новые каналы. Все данные, хранящиеся в буферах будут потеряны, и память

используется все новые пользовательских каналов будет утилизирован.

B061 3E10 CLEAR_NEW LD A, # 10; = количество потоков, чтобы рассмотреть

B063 3D CLEARLOOP декабря; = номер потока следующем потоке B064 F5 PUSH AF B065 A7 И, сигнал “Данные в буфер, будут потеряны” B066 CD01B0 ЗВОНОК CLOSE_CLR; Очистить канал, связанный с                                            ; Этот поток B069 F1 POP AF B06A 20F7 JR NZ, CLEARLOOP; Loop назад, пока все потоки не очищается B06C C9 RET; возврат

Чтобы открыть новый канал. На вход А “должно содержать указанное количество потока;

Должен содержать название канала (кодов символов ASCII); До н.э. должны содержать длину требуемой информации канала блока; DE должно содержать ввод адреса; HL должно содержать выходной адрес; и IX должна содержать адрес подпрограммы, чтобы отправить все данные, сохраненные в буфер (или 0052h, если это не применяется).

B06D C5 OPEN_NEW PUSH BC; длина Стек инфо блока канала

B06E DDE5 PUSH IX; Стек близко адрес буфера B070 F5 PUSH AF; Стек название канала B071 D5 PUSH DE; вход Стек адрес B072 E5 PUSH HL; Стек выходной адрес B073 C5 PUSH BC; длина Стек инфо блока (снова) B074 08 EX AF, AF ‘; число = поток прикрепить B075 CD2117 ЗВОНОК STR_DATA_A; BC = поток данных для данного потока B078 78 LD A, B B079 B1 ИЛИ С ; [Это следующая команда была упущена из листинга в части 2.] ; [Коррекция не был напечатан до часть 5. JimG] B07A C1 POP BC B07B 2802 JR Z, OPEN_NEW2; Перейти если поток уже открытой B07D CF RST # 08; “О Неверный поток” Отчет об ошибке B07E 17 DEFB # 17 B07F E5 OPEN_NEW2 PUSH HL; указатель стека на поток переменной B080 2A535C LD HL, (PROG) B083 2B декабря HL; HL указывает на 80h байт в конце                                            ; Область информации канала B084 CD5516 ЗВОНОК MAKE_ROOM; Сделать комнату для новой информации канала B087 23 INC HL; HL указывает на новый информационный канал блока B088 22515C LD (CURCHL), HL; Сделать это текущий канал B08B E5 PUSH HL B08C DDE1 POP IX; IX указывает на канал инфо блок B08E 23 INC HL; HL указывает на второго байта информации B08F ED4B4F5C LD BC, (CHANS); BC указывает на начало Чаны области B093 A7 И B094 ED42 SBC HL, BC; HL = требуемое значение поток B096 EB EX DE, HL; DE = требуемое значение поток B097 E1 POP HL; HL указывает на поток переменную B098 73 LD (HL), E B099 23 INC HL B09A 72 LD (HL), D; Связать переменную потока с требуется                                            ; Значение, тем самым открывая поток B09B DDE5 PUSH IX B09D E1 POP HL; точки HL для канала инфо блок B09E D1 POP DE; DE = выходной адрес B09F C1 POP BC; BC = ввод адреса B0A0 CDAEB0 ЗВОНОК OPENSTORE; Храните эти адреса в информационном блоке B0A3 F1 POP AF; = название канала B0A4 77 LD (HL), A; Интернет-магазин канала B0A5 23 INC HL B0A6 3634 LD (HL), # 34 B0A8 23 INC HL B0A9 3612 LD (HL), # 12; Сигнал “канал определяемые пользователем” B0AB 23 INC HL B0AC D1 POP DE; DE = пристальное адрес буфера B0AD C1 POP BC; BC = длина инфо блока канала B0AE 73 OPENSTORE LD (HL), E B0AF 23 INC HL B0B0 72 LD (HL), D; выход магазин или близко адрес B0B1 23 INC HL B0B2 71 LD (HL), C B0B3 23 INC HL B0B4 70 LD (HL), B; адрес ввода-магазин или длина блока B0B5 23 INC HL B0B6 C9 RET; возврат

Чтобы справиться с параметрами управляющих кодов, и жетонов ключевых слов. Эта подпрограмма

может быть использован с любой определенной пользователем канала при условии, что (IX + 0B) содержит флаги. Биты 1 и 0 кол входящие параметры для использования в цветных управления, AT и TAB; а бит 7 устанавливается, если пространство только что был напечатан на канал. По возвращении флаг Вход будет установлен, если не больше потребности не поделаешь, в противном случае флаг нуля будет установлен, если персонаж находится графический символ, а флаг Carry будет набор для блочных графики и управляющих кодов.

B0B7 4F CHR_TYPE LD C, A; C = символ “печать”

B0B8 DD7E0B LD, (IX + # 0B); содержит различные флаги B0BB 57 LD D, A; D содержит различные флаги B0BC E603 И # 03; = число параметров ожидается B0BE 2816 JR Z, CTYP_GO; Перейти если параметры не ожидается B0C0 15 декабря D B0C1 7А LD A, D B0C2 DD770B LD (IX + # 0B),; Уменьшение счетчика параметр B0C5 E603 И # 03 B0C7 2805 JR Z, CTYP_LAST; Перейти если это последний параметр Этот параметр (средний) магазин; B0C9 FD71D5 LD (TVDATA) привет, C B0CC 185E JR CTYP_DONE; Перейти, чтобы выйти B0CE 3A0E5C CTYP_LAST LD, (TVDATA) вот; = оригинальный код управления B0D1 FD46D5 LD B, (TVDATA) привет; B = средний параметр (если он существует) B0D4 1847 JR CTYP_CTRX; Перейти, чтобы выйти B0D6 213B5C CTYP_GO LD HL, ФЛАГИ; HL указывает на системные флаги B0D9 1EA3 LD E, “СПЕКТР”; E = ключевое слово первым Спектр 128К B0DB CB66 БИТ 4, (HL) B0DD 2002 JR NZ, CTYP_MODE; Перейти если в режиме 128К B0DF 1EA5 LD E, “RND”; E = ключевое слово первым Спектр 16K / 48K B0E1 79 CTYP_MODE LD A, C; A = символ для печати B0E2 BB CP E B0E3 380F JR C, CTYP_NTOK; Перейти если это ключевое слово B0E5 DD7E0B LD, (IX + # 0B); содержит различные флаги B0E8 07 RLCA; бит 0 = ведущий пространство немного B0E9 AE XOR (HL) B0EA E601 И # 01 B0EC AE XOR (HL) B0ED 77 LD (HL), A; Связать ведущих космических немного как reqd B0EE 79 LD A, C; A = символ для печати B0EF CD520B ЗВОНОК P_T & УДГ; Expand это ключевое слово B0F2 1838 JR CTYP_DONE; Перейти, чтобы выйти B0F4 FE80 CTYP_NTOK CP # 80 B0F6 380D JR C, CTYP_NGRA; Перейти если это графика символ B0F8 DDCB0BBE RES 7, (IX + # 0B); Сигнал “Ведущий пространство будет reqd” B0FC FE90 CP # 90 B0FE 3003 JR NC, CTYP_UDG; Перейти если это УДГ B100 BF CP; Установите флаг нуля B101 37 SCF; указан флага переноса B102 C9 RET; возврат B103 BF CTYP_UDG CP; Установить флаг нуля; сброс флага переноса B104 C9 RET; возврат B105 FE20 CTYP_NGRA CP # 20 B107 380C JR C, CTYP_CTRL; Перейти с управляющих символов B109 DDCB0BBE RES 7, (IX + # 0B); Сигнал “Ведущий пространство будет reqd” B10d 2004 JR NZ, CTYP_SPCE; Перейти если персонаж не является ПРОСТРАНСТВО B10F DDCB0BFE SET 7, (IX + # 0B); Сигнал “Ведущие места не reqd” B113 A7 CTYP_SPCE И, сброс в нуль флаг; сброс флага переноса B114 C9 RET; возврат B115 FE10 CTYP_CTRL CP # 10 B117 3804 JR C, CTYP_CTRX; Перейти, чтобы выйти с кодами 00 до 0F B119 FE18 CP # 18 B11B 3803 JR C, CTYP_PARA; Перейти с кодами от 10 до 18 B11D FEFF CTYP_CTRX CP #FF; Сброс нулевой флаг; установить флаг Carry B11F C9 RET; возврат B120 320E5C CTYP_PARA LD (TVDATA) вот,; магазин контрольный код B123 14 INC D; Сигнал “Один параметр требуется” B124 FE16 CP # 16 B126 3801 JR C, CTYP_SET; Перейти с кодами от 10 до 16 B128 14 INC D; Сигнал “Два параметры, необходимые” B129 DD720B CTYP_SET LD (IX + # 0B), D; магазин ряд reqd параметры B12C F6FF CTYP_DONE ИЛИ # FF; Установите флажок Зарегистрировать B12E C9 RET; возврат

Чтобы справиться с управлением запятая, и функции TAB, а. Эта подпрограмма

может быть использован с любой определенной пользователем канала, при условии, что (IX + 0B) содержит флаги как указано выше; что (IX + 0C) содержит координаты х (или номер столбца) из текущее положение печатающей; и что (IX + 0D) содержит ширину линии (или общее количество столбцов допускается). Флаги на возвращение, как указано выше, за исключением того, что Флаг Вход будет установлен, если запятая или TAB были рассмотрены.

B12F CDB7B0 CHR_TYPE2 ЗВОНОК CHR_TYPE; Сделка с Ctrl Params и ключевые слова B132 DD5E0D CHRTYPE2A LD E, (IX + # 0D); E = ширина линии B135 F5 PUSH AF; Стек флаги B136 FE06 CP # 06 B138 2806 JR Z, CTYP_COMM; Перейти с контролем запятыми B13A FE17 CP # 17 B13C 2810 JR Z, CTYP_TAB; Перейти с контролем TAB B13E F1 POP AF; восстановление флаги B13F C9 RET; возврат B140 DD7E0C CTYP_COMM LD, (IX + # 0C); = номер столбца позиции печати B143 3C INC B144 E6F8 И # F8 B146 C608 добавить, # 08; = колонка число следующего поля B148 BB CP E B149 3811 JR C, CTYP_SPCS; Перейти если номер столбца в диапазоне B14B 7В LD A, E B14C 180E JR CTYP_SPCS; остальное вкладка мимо конец текущей строки B14E 61 CTYP_TAB LD H, C B14F 68 LD L, B; HL = параметр TAB B150 1600 LD D, # 00; DE = ширину линии B152 ED52 CTYP_LOOP SBC HL, DE B154 30FC JR NC, CTYP_LOOP B156 19 ДОБАВИТЬ HL, DE; Снизить модулю длины линии B157 7D LD A, L; число = столбец TAB, чтобы B158 A7 И B159 2001 JR NZ, CTYP_SPCS; Перейти если нулевой столбец не требуется B15B 7В LD A, E; Tab мимо конца текущей строки B15C DDBE0C CTYP_SPCS CP (IX + # 0C) B15F 2807 JR Z, CTYP_EXIT; Перейти если требуется колонка достиг B161 F5 PUSH AF B162 CD390C ЗВОНОК PO_SPACE; Распечатать пространство B165 F1 POP AF B166 18F4 JR CTYP_SPCS; Перейти назад, чтобы увидеть, если закончил B168 F1 CTYP_EXIT POP AF; = контроль просто имели дело с B169 F6FF ИЛИ # FF; Установите флажок Зарегистрировать B16B C9 RET; возврат

Ниже две точки входа PAGE_0 и PAGE_7 будет страница в памяти страницы нулю и

RAM страница семь соответственно. Процедуры не будет иметь никакого эффекта, если не называется из Спектр 128 в режиме 128К.

B16C C5 PAGE_0 PUSH BC

B16D 0600 LD B, # 00; B = необходимое количество страница B16F 1803 JR PAGE_B; переход вперед B171 C5 PAGE_7 PUSH BC B172 0607 LD B, # 07; B = количество требуется страницу B174 F5 PAGE_B PUSH AF B175 FDCB0166 БИТ 4, (ФЛАГИ) B179 280E JR Z, PAGE_EXIT; Перейти если не в режиме 128К B17B 3A5C5B LD, (BANK_M); A = текущие флаги страница B17E E6F8 И # F8 B180 B0 ИЛИ B B181 01FD7F LD BC, # 7FFD; BC = порт не reqd не менять страницу B184 325C5B LD (BANK_M),; Сигнал требуется RAM страницу B187 ED79 OUT (C), а на деле изменить страницы B189 F1 PAGE_EXIT POP AF B18A C1 POP BC B18B C9 RET; возврат

Следующие три подпрограммы требуют, чтобы первоначально HL указывает на один байт на

экран, и будет каждый корректировать стоимость HL по-другому. Первый укажет HL для пикселя непосредственно под заданное; вторая воля Точка HL вниз на одну строку (то есть вниз восемь пикселей.); и третий найдете адрес соответствующего байта атрибута.

B18C 24 DOWN_1 INC H; Предположим, в квадрате символов

B18D 7С LD A, H B18E E607 И # 07 B190 C0 RET NZ; Возврат, если это так, B191 7D LD A, L B192 C620 добавить, # 20 B194 6F LD L, A; Предположим, пересекая экран трети B195 D8 RET C; Возврат, если это так, B196 7С LD A, H B197 D608 SUB # 08 B199 67 LD H, A; Регулировка для в экран третьего B19A C9 RET; возврат

B19B 7D DOWN_8 LD A, L

B19C C620 добавить, # 20 B19E 6F LD L, A; Предположим, в третий экран B19F D0 RET NC; Возврат, если это так, B1A0 7С LD A, H B1A1 C608 ADD A, # 08 B1A3 67 LD H, A; Регулировка для пересечения экрана трети B1A4 C9 RET; возврат

B1A5 7С ATTR_ADDR LD A, H

B1A6 1F АСР B1A7 1F АСР B1A8 E606 И # 06; Изолировать экран третий номер B1AA F6B0 ИЛИ # B0 B1AC CB14 RL H; флаг переноса = номер экрана B1AE 1F АСР B1AF 67 LD H, A; HL = адрес атрибут байт B1B0 C9 RET; возврат

Остальная часть программы в этой статье обеспокоен исключительно с

ОКНО каналы. Следующая подпрограмма будет двигаться позицию печати на Начало (A + 1) -й строки текущего окна.

B1B1 DDBE0F LINE_A CP (IX + W_HEIGHT)

B1b4 D29F1E JP NC, REPORT_B; Дайте ошибку, если номер строки слишком большой B1B7 DD360C00 LD (IX + W_XCOORD), # 00; Сброс координаты х B1BB DD770E LD (IX + W_YCOORD),; Связать новый координату B1BE DD6E12 LD L, (IX + W_HOME) вот B1C1 DD6613 LD H, (IX + W_HOME) привет; HL = адрес верхней LH углу B1C4 A7 И B1C5 2806 JR Z, LINEFOUND; Перейти если линия нулевой требуется B1C7 47 LD B, A; B = номер строки требуется B1C8 CD9BB1 LINE_LOOP ЗВОНОК DOWN_8; HL = адрес следующей строки B1CB 10FB DJNZ LINE_LOOP; HL = адрес требуемой линии B1CD CD9AB3 LINEFOUND ЗВОНОК STOREADDR; магазин этот адрес в качестве позиции печати B1D0 DDCB0BFE SET 7, (IX + W_FLAGS); Сигнал “Ведущий пространство не требуется” B1D4 DDCB0B66 БИТ 4, (IX + W_FLAGS) B1D8 C8 RET Z; Возврат, если это “Быстрый” канал B1D9 DD361600 LD (IX + W_PIX), # 00; Сброс печати поз внутри полукокса площади B1DD C9 RET; возврат

На следующий подпрограмма будет очистить одну строку окна, учитывая, что содержит

атрибут байт с которой, чтобы очистить; что HL содержит адрес строки в пределах экрана; и что BC содержит ширину линии в квадратах, менее один.

B1DE C5 CLW_LINE PUSH BC; длина Стек линии, менее одного

B1DF E5 PUSH HL; Стек адрес линии B1E0 F5 PUSH AF; Стек атрибут байт B1E1 CDA5B1 ЗВОНОК ATTR_ADDR; HL = адрес строки атрибута B1E4 F1 POP AF; = байт атрибут B1E5 54 LD D, H B1E6 5D LD E, L B1E7 13 INC DE; DE указывает на второго байта атрибута B1E8 77 LD (HL), A; магазин первый байт атрибут B1E9 EDB0 LDIR; байты оставаясь атрибутом магазин B1EB E1 POP HL; HL = адрес строки B1EC C1 POP BC; BC = длина линии, менее одного B1ED 3E08 LD A, # 08; = число строк в строке B1EF 54 LD D, H B1F0 5D LD E, L B1F1 13 INC DE; DE указывает на второй байт в строке B1F2 E5 CLWL_LOOP PUSH HL; Стек адрес первого байта в строке B1F3 D5 PUSH DE; Стек адрес второй байт в строке B1F4 C5 PUSH BC; длина Стек линии, менее одного B1F5 3600 LD (HL), # 00; Сброс первый байт B1F7 EDB0 LDIR; Сброс оставшиеся байты B1F9 C1 POP BC; BC = длина линии, менее одного B1FA D1 POP DE; DE = адрес 2-го байта в строке B1FB E1 POP HL; HL = адрес 1-го байта в строке B1FC F5 PUSH AF; Стек счетчик цикла B1FD CD8CB1 ЗВОНОК DOWN_1; HL = адр из первых байта в следующей строке B200 F1 POP AF; = счетчик цикла B201 14 INC D; DE = адрес 2-го байта в строке B202 3D декабря B203 20ED JR NZ, CLWL_LOOP; Повторите для всех восьми строк B205 C9 RET; возврат

Это очень короткий подпрограмма будет получать ширину текущего окна, измеренная

на площадях, в C регистра.

B206 DD4E0D GET_WIDTH LD C, (IX + W_WIDTH); C = ширина окна, в символах

B209 DDCB0B66 БИТ 4, (IX + W_FLAGS) B20D C8 RET Z; Возвращение с “Fast” окон B20E DD4E1C LD C, (IX + W_WIDTH_8); C = ширина окна, на площадях B211 C9 RET

Чтобы открыть окно канала и приложите его к потоку. Эта подпрограмма будет открыть

либо “Быстрый” или “Slow” Окно канала. Регистры должны быть назначены на запись следующим образом:

Для обоих типов канала:

“Номер потока в который преобразуется канал должен быть прикреплен Байт атрибут используется изначально у окна В число линий между верхней части окна и в верхней части экрана С квадратов между левой части окна и слева от число      экран D Высота окна, на площадях Е ширину окна, в квадраты H 00, если свиток пауза отключена; FF, если свиток пауза включена L 00 для окна “Fast”; FF для окна “Slow”

Только для медленных окон:

BC ‘Адрес нормальной набора символов, минус 100h DE ‘Адрес графического набора символов (начиная с CHR $ 80h) Н ‘Ширина этих символов в пикселях

B212 F5 OPEN_WIND PUSH AF; Стек атрибут байт

B213 C5 PUSH BC; Стек координаты окна B214 D5 PUSH DE; Стек размер окна B215 E5 PUSH HL; флаги Stack B216 011600 LD BC, # 0016; BC = длина “Fast” чан инфо блока B219 DD215200 LD IX, # 0052; Сигнал “Нет буфера”, предполагая,                                            ; “Быстрый” канал B21D 2C INC L ; [Следующая строка была напечатана в 2021 в журнале,] ; [Который прыгнул не по адресу. JimG] B21E 2020 JR NZ, OPWN_CREA; Перейти с «быстрый» каналов B220 1600 LD D, # 00; DE = ширина окна, на площадях B222 62 LD H, D B223 6B LD L, E; ширина HL = окно, на площадях B224 29 ДОБАВИТЬ HL, HL B225 29 ДОБАВИТЬ HL, HL

                                           

JimG]

                                              

JimG]

JimG]

                                              

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

Описание Streams and Channels (автоматический перевод)

1 2 3 4 5 6 7 8

ВОДОТОКИ И КАНАЛЫ

Тони Бейкер часть 3 из 5, ZX Computing февраля 1987

В заключительной части программы Тони Бейкера Windows.

[Обратите внимание, что код в STREAMS.TAP “часть3”]

[Включает код с “PART2”. JimG]

В прошлом месяце мы начали экспериментировать с окнами. Перечень продолжает

В качестве демонстрации, дополнительная программа WIND_DEMO которые я помечены на

в конце на адрес B544 откроется окно двадцать четыре квадраты шириной восемь квадратов высоких, расположенных на 2,1 (по отношению ко всему экран) с желтой бумаге и синими чернилами. Кроме того, окно будет быть медленным окно, так слова никогда не будут сокращены в два раза, и хотя Стандартный набор символов используется, они определяются как семь бит Широкий, не восемь, так что вы получите больше символов, чем обычно. Запуск программы сразу откроется окно и прикрепить его на поток четыре. После PRINT # 4 будет печатать на окно.

Следуйте через

Для тех из вас, кто желает следовать программе через и понять

как это все работает, я вам скажу, что программа начинает работать с расположение ОКНО (адрес B4F1) с регистром, содержащий Характер должны быть напечатаны, всякий раз, когда RST 10 используется с этим каналом.

О – кстати – в то время как мы говорим о процедуре окне выполните

Взгляд на четырех команд следующее этикетке WIND_CTRL.

Инструкция ЗВОНОК выполняет функцию контроля кода, поп инструкция восстанавливает управляющий символ в регистр A, и Инструкция RET завершает все – рутина закончилась – Контроль будет проходить обратно в RST 10 самой подпрограммы, а затем вернуться к PRINT заявлении вызвавшего RST 10, которые будут использоваться. Но … Это что и инструкция делать непосредственно перед RET?

Комментарий рядом с инструкцией читает “Сброс флаг переноса”. Почему? – Наверняка все в настоящее время завершена. Мы не должны беспокоиться о Флаги должны мы?

К сожалению, мы делаем. Вы видите, когда управляющий код, такой как бумага 4 или

INVERSE 1 используется в операторах печати, то соответствующие управления коды посылаются RST 10, которые будут осуществляться. Процедура PRINT ожидает флаг переноса будет сбросить по возвращении из такой рутины, и будет производить сообщение об ошибке «C Чепуха в BASIC”, если это не случай.

В следующем месяце я дам вам не меньше, чем два новых канала: модифицированный

Сеть канал для владельцев ZX Interface 1, который будет успешно взаимодействовать с QL, и канал, который позволит пользователи Spectrum 128 использовать стандартный ZX Printer в то время в Режим 128K, экономя много денег в процесс. Увидимся.

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

Следующая подпрограмма выводит новую строку; то есть. она перемещает позицию печати на левая кромка следующей строке вниз.

B2BB CDC3B2 ENTER ЗВОНИТЕ ENTER_1; Печать одного перевода строки раз

B2BE DDCB0B56 БИТ 2, (IX + W_FLAGS) B2C2 C8 RET Z; Возврат при использовании одного высоту B2C3 DD7E0E ENTER_1 LD, (IX + W_YCOORD); = ток координату B2C6 3C INC; = новый координату B2C7 DDBE0F CP (IX + W_HEIGHT) B2CA C2B1B1 JP NZ, LINE_A; Перейти если в диапазоне двигаться печати поз B2CD DDCB0B6E БИТ 5, (IX + W_FLAGS) B2D1 2812 JR Z, SCROLL; Перейти если свиток пауза отключена B2D3 DD3515 DEC (IX + W_SCROLLS); Уменьшение счетчика прокрутки B2D6 200D JR NZ, SCROLL; Перейти если это не требуется прокрутки пауза B2D8 DD7E0F LD, (IX + W_HEIGHT) B2DB DD7715 LD (IX + W_SCROLLS),; инициализация счетчика прокрутки B2DE 3E7F SCR_PAUSE LD A, # 7F B2E0 DBFE IN A, (# FE); Scan часть клавиатуры B2E2 1F АСР B2E3 38F9 JR C, SCR_PAUSE; Пауза, пока не нажата ПРОСТРАНСТВО B2E5 CD541F SCROLL ЗВОНОК BREAK_KEY B2E8 D2000D JP NC, REPORT_D; Дайте отчет об ошибке при нажатии ПЕРЕРЫВ B2EB DD7E0E LD, (IX + W_YCOORD); = у координата нижней строке B2EE F5 PUSH AF B2EF CDB1B1 ЗВОНОК LINE_A; Move печати пос начать дна                                            ; Линия окне B2F2 С1 POP BC; B = количество строк для копирования B2F3 CD06B2 ЗВОНОК GET_WIDTH; C = ширина окна в квадраты B2F6 DD6E12 LD L, (IX + W_HOME) вот B2F9 DD6613 LD H, (IX + W_HOME) привет; HL = адрес верхнем левом углу B2FC CD71B1 ЗВОНОК PAGE_7; Использование RAM страница 7 в случае ЮКЖД 1, используемого B2FF C5 SCR_LOOP1 PUSH BC; Стек счетчик цикла B300 0600 LD B, # 00; BC = ширина линии B302 C5 PUSH BC B303 E5 PUSH HL B304 CDA5B1 ЗВОНОК ATTR_ADDR; HL = адр этого атрибута линии B307 112000 LD DE, # 0020 B30A EB EX DE, HL; DE = эл этого атрибута линии B30B 19 ДОБАВИТЬ HL, DE; HL = адр из следующей строке атрибута B30C EDB0 LDIR; Копировать один атрибут линия B30E E1 POP HL B30F C1 POP BC B310 E5 PUSH HL B311 CD9BB1 ЗВОНОК DOWN_8; HL = адрес следующей строки B314 D1 POP DE; DE = адрес этой линии B315 E5 PUSH HL B316 3E08 LD A, # 08; = число строк в строке B318 C5 SCR_LOOP2 PUSH BC B319 D5 PUSH DE B31A E5 PUSH HL B31B EDB0 LDIR; Копировать один ряд с линии

B31D E1 POP HL
B31E D1 POP DE
B31F C1 POP BC
B320 24 INC H; HL = адр из следующего ряда следующей строке
B321 14 INC D; DE = эл следующего строке этой линии

B322 3D декабря B323 20F3 JR NZ, SCR_LOOP2; Скопируйте всю строку B325 E1 POP HL B326 C1 POP BC B327 10d6 DJNZ SCR_LOOP1; Перенесите все необходимые линии B329 0B декабря до н.э., BC = длина линии, менее одного B32A DD7E14 LD, (IX + W_ATTR); = байт атрибут B32D CDDEB1 ЗВОНОК CLW_LINE; Очистить Суть B330 C36CB1 JP PAGE_0; Восстановление RAM страницу нулевой и возврат

Следующие подпрограммы занимается всеми кодами управления для запятая-контроля, за исключением

и TAB (они имели дело с помощью CHR_TYPE2 по адресу B12F). На входе A зарегистрируйтесь будет содержать сам код управления, в то время как требуется любые параметры будут храниться в B (средний параметр, если таковой существует) и С (последний параметр).

B333 FE0D УПРАВЛЕНИЯ СР “введите”

B335 2884 JR Z, ENTER; Перейти иметь дело с “введите” B337 D610 SUB # 10 B339 D8 RET C; Возвращение с кодами 00 до 0F B33A FE06 CP # 06 B33C 2827 JR Z, CTRL_AT; Перейти иметь дело с AT B33E D0 RET NC; Возвращение с кодами 17 до 1F B33F C65F ДОБАВИТЬ, CTRL_INFO ло B341 6F LD L, B342 26B3 LD H, CTRL_INFO привет; HL точки для контроля инфо стол B344 46 LD B, (HL); B = немного маска для этого элемента управления B345 111400 LD DE, # 0014; DE = IX смещение к W_ATTR B348 FE63 CP # 63 B34A 3802 JR C, CTRL_CONT; Перейти если Ctrl обратный / OVER B34C 1E0B LD E, # 0B; ​​DE = IX смещение к W_FLAGS B34E DDE5 CTRL_CONT PUSH IX B350 E1 POP HL; точки HL для канала инфо блок B351 19 ДОБАВИТЬ HL, DE; HL указывает на переменную, чтобы изменить B352 79 LD A, C; A = параметр управления B353 48 LD C, B, C = немного маска B354 0F RRCA B355 07 CTRL_LOOP RLCA B356 CB18 RR B B358 30FB JR NC, CTRL_LOOP; параметр = Ctrl в правильном POSN B35A AE XOR (HL) B35B A1 и C B35C AE XOR (HL); Mix в reqd биты в соответствии с маской B35D 77 LD (HL), A; переменная магазин B35E C9 RET

B35F 07 CTRL_INFO DEFB # 07; Бит маски для INK

B360 38 DEFB # 38; Бит маски для БУМАГИ      80 DEFB # 80; Бит маски для FLASH B362 40 DEFB # 40; Бит маски для ярких B363 08 DEFB # 08; Бит маски для INVERSE B364 04 DEFB # 04; Бит маски для OVER

На следующий подпрограмма окно версия функции AT. Он выполняет

Функция AT B, C для текущего окна.

B365 C5 CTRL_AT PUSH BC

B366 78 LD A, B; A = предложила координату B367 CDB1B1 ЗВОНОК LINE_A; Move печати пос начать этой линии B36A C1 POP BC B36B 79 LD A, C; A = предлагаемые координаты х B36C A7 И B36D C8 RET Z; Возврат, если задача уже сделано B36E DDBE0D CP (IX + W_WIDTH) B371 D29F1E JP NC, REPORT_B; Дайте отчет об ошибке, если вне диапазона B374 DD770C LD (IX + W_XCOORD),; Хранить новый координаты х B377 0600 LD B, # 00; ВС = х координат B379 DDCB0B66 БИТ 4, (IX + W_FLAGS) B37D 281A JR Z, AT_EXIT; Перейти с «быстрый» каналов B37F E5 PUSH HL; Стек адрес начала строки B380 DD4E17 LD C, (IX + W_CH_WID); BC = ширина символа в пикселях B383 60 LD H, B B384 68 LD L, B; HL = 0000 B385 09 AT_LOOP_1 ДОБАВИТЬ HL, BC B386 3D декабря не B387 20FC JR NZ, AT_LOOP_1; HL = нет пикселей, чтобы начать полукокса B389 0603 LD B, # 03 B38B CB3C AT_LOOP_2 SRL H B38D CB1D RR L B38F 1F АСР B390 10F9 DJNZ AT_LOOP_2; HL = нет квадратов, чтобы начать полукокса B392 07 RLCA B393 07 RLCA B394 07 RLCA; = положение пикселя в полукокса площади B395 DD7716 LD (IX + W_PIX),; Хранить в переменной B398 C1 POP BC; BC = адрес начала строки B399 09 AT_EXIT ДОБАВИТЬ HL, BC; HL = новая печать позиция адрес B39A DD7510 STOREADDR LD (IX + W_PRPOS) вот, L B39D DD7411 LD (IX + W_PRPOS) привет, H; магазин новая позиция печати B3A0 C9 RET; возврат

Следующая подпрограмма очень короткий и простой. Это просто устанавливает атрибут

байт, соответствующий адресу экрана в HL.

B3A1 E5 SET_ATTR PUSH HL

B3A2 CDA5B1 ЗВОНОК ATTR_ADDR; HL = адрес байта атрибута B3A5 DD7E14 LD, (IX + W_ATTR); A = текущие цвета B3A8 77 LD (HL), A; магазин атрибут байт B3A9 E1 POP HL B3AA C9 RET; возврат

Эта подпрограмма предназначена для использования с “медленным” только окна. Это будет сюжет один

ряд персонажа на экране.

B3AB CDA1B3 PLOT_ROW ЗВОНОК SET_ATTR; Установить атрибут байт

B3AE 7E LD, (HL); = байт с экрана B3AF А.А. XOR D B3B0 A0 И B B3B1 А.А. XOR D; Mix в битах от характера B3B2 77 LD (HL), A; Хранить в экране B3B3 79 LD A, C; A = младший байт маски B3B4 3C INC B3B5 280A JR Z, PLRW_EXIT; Выход, если все биты хранятся на экране B3B7 23 INC HL; HL указывает на следующий байт экрана B3B8 CDA1B3 ЗВОНОК SET_ATTR; указан этот байт атрибута, а B3BB 7E LD, (HL); = байт с экрана B3BC AB XOR E B3BD A1 и C B3BE AB XOR E; Смешайте в битах от характера B3BF 77 LD (HL), A; Хранить в экране B3C0 2B декабря HL; HL указывает на оригинальный байт экрана B3C1 C38CB1 PLRW_EXIT JP DOWN_1; Точка HL один пиксель вниз, и возвращение

Эта подпрограмма будет вычислять 8 * + DE, а также будет собирать текущую печать

Положение.

B3C4 6F ГОТОВЯТСЯ LD L, A

B3C5 2600 LD H, # 00; HL = код символа B3C7 29 ДОБАВИТЬ HL, HL B3C8 29 ДОБАВИТЬ HL, HL B3C9 29 ДОБАВИТЬ HL, HL; HL = восемь раз символьный код B3CA 19 ДОБАВИТЬ HL, DE B3CB EB EX DE, HL; DE = адрес расширения пикселей B3CC DD6E10 LD L, (IX + W_PRPOS) вот B3CF DD6611 LD H, (IX + W_PRPOS) привет; HL = адрес позиции печати B3D2 C9 RET; возврат

Эта подпрограмма будет собирать один байт от расширения пикселей, на который указывает DE

и будет инвертировать его в случае необходимости.

B3D3 1A GET_ROW LD, (DE); = следующая строка расширения пикселей

B3D4 13 INC DE; DE указывает на следующую строку B3D5 DDCB0B5E БИТ 3, (IX + W_FLAGS) B3D9 C8 RET Z; Возврат если INVERSE 1 в работе B3DA 2F CPL, иначе инвертировать строку B3DB C9 RET

Это следующий и очень важный подпрограмма будет на самом деле печатать символ,

указано в реестре А, на текущем окне.

B3DC F5 PRINT_CHR PUSH AF; Стек характер для печати

B3DD F5 PUSH AF; Стек характер печатать (опять же) B3DE DD7E0C LD, (IX + W_XCOORD); = ток X координат B3E1 DDBE0D CP (IX + W_WIDTH) B3E4 CCBBB2 ЗВОНОК Z, ENTER; печати новой строки, если в конце строки B3E7 DDCB0B66 БИТ 4, (IX + W_FLAGS) B3EB 2034 JR NZ, PCHRSLOW; Перейти с окном “Slow” B3ED F1 POP AF; = символ для печати B3EE ED5B365C LD DE, (знаков); DE = эл нормального набор символов – 100h B3F2 2012 JR NZ, PCHR_OK_1; Перейти с ASCII символа B3F4 300A JR NC, PCHR_UDG; Перейти с пользовательскими графики B3F6 47 LD B, B3F7 CD380B ЗВОНОК PO_GR_1; Построить блок графику B3FA 11925C LD DE, MEMBOT; DE указывает на расширение пикселей B3FD AF XOR B3FE 1806 JR PCHR_OK_1; переход вперед B400 D690 PCHR_UDG SUB # 90 B402 ED5B7B5C LD DE, (УДГ); DE указывает на определенные пользователем графику B406 CDC4B3 PCHR_OK_1 ЗВОНОК ГОТОВЯТСЯ; DE = адрес расширения пикселей                                            ; HL = адрес позиции печати B409 CDA1B3 ЗВОНОК SET_ATTR; атрибут Набор для этой площади B40C E5 PUSH HL B40D 0608 LD B, # 08; B = количество строк в строке B40F CDD3B3 PCHRLOOP1 ЗВОНОК GET_ROW; = следующая строка из расширения B412 CD71B1 ЗВОНОК PAGE_7; Использование RAM страница 7 в случае Scrn 1 в использовании B415 77 LD (HL), A; магазин строка экрана B416 24 INC H; HL указывает на следующую строку B417 CD6CB1 ЗВОНОК PAGE_0; Восстановление RAM страницу нулевой B41A 10F3 DJNZ PCHRLOOP1; Печать весь характер Форм B41C E1 POP HL B41D 23 INC HL; HL = новая позиция печати B41E C3B2B4 JP PCHR_EXIT; Перейти, чтобы выйти B421 DDCB0B56 PCHRSLOW БИТ 2, (IX + W_FLAGS) B425 281E JR Z, PCHRSLOW2; не Перейти если использование двойной высоты B427 DD7E0F LD, (IX + W_HEIGHT); = высота окна B42A 3D декабря; = у координата нижней строке B42B DDBE0E CP (IX + W_YCOORD) B42E 2015 JR NZ, PCHRSLOW2; не Перейти если в нижней строке B430 DD4E0C LD C, (IX + W_XCOORD); C = ток х координат B433 47 LD B, A; B = ток координату B434 5 декабря B; B = координату после прокрутки B435 DD7E0B LD, (IX + W_FLAGS) B438 F5 PUSH AF; флаги Stack B439 C5 PUSH BC; координаты Stack B43A CDC3B2 ЗВОНОК ENTER_1; прокрутку экрана, как только B43D C1 POP BC; BC = координаты B43E CD65B3 ЗВОНОК CTRL_AT; Move позиция печати назад, где его                                            ; Принадлежит B441 F1 POP AF B442 DD770B LD (IX + W_FLAGS),; Восстановление флагов B445 F1 PCHRSLOW2 POP AF; = символ для печати B446 DD5E18 LD E, (IX + W_CHARS) вот B449 DD5619 LD D, (IX + W_CHARS) привет; DE = эл нормального набора CHR – 100h B44C 2008 JR NZ, PCHR_OK_2; Перейти с персонажами ASCII B44E D680 SUB # 80 B450 DD5E1A LD E, (IX + W_UDG) вот B453 DD561B LD D, (IX + W_UDG) привет; DE указывает на графические CHR установить B456 CDC4B3 PCHR_OK_2 ЗВОНОК ГОТОВЯТСЯ; DE = адрес расширения пикселей                                            ; HL = адрес позиции печати B459 E5 PUSH HL; Стек адрес позиции печати B45A 01FFFF LD BC, # FFFF B45D DD7E17 LD, (IX + W_CH_WID); = ширина CHR в пикселях B460 CB38 PCHRMASK1 SRL B B462 CB19 RR C B464 3D декабря B465 20F9 JR NZ, PCHRMASK1; BC = маска, еще не в положении B467 DD7E16 LD, (IX + W_PIX); = пиксель POSN в CHR площади B46A A7 И B46B 2808 JR Z, PCHRMASK3; Перейти если маски ОК B46D 37 PCHRMASK2 SCF B46E CB18 RR B B470 CB19 RR C B472 3D декабря B473 20F8 JR NZ, PCHRMASK2; Иначе повернуть маску на место B475 3E08 PCHRMASK3 LD A, # 08; = число строк в строке B477 F5 PCHRLOOP2 PUSH AF; Стек счетчик цикла B478 CDD3B3 ЗВОНОК GET_ROW; = следующая строка из расширения B47B D5 PUSH DE; указатель стека в расширении B47C 57 LD D, B47D DD7E16 LD, (IX + W_PIX); = пиксель POSN в CHR площади B480 A7 И B481 2807 JR Z, PCHR_ROW; Перейти если пикселей выровнены B483 CB1A PCHRSHIFT RR D B485 CB1B RR E B487 3D декабря B488 20F9 JR NZ, PCHRSHIFT; Сдвиг пикселов в положении B48A CD71B1 PCHR_ROW ЗВОНОК PAGE_7; Установить RAM страница 7 в случае Scrn 1 в использовании B48D CDABB3 ЗВОНОК PLOT_ROW; земля ряд на экране B490 DDCB0B56 БИТ 2, (IX + W_FLAGS) B494 C4ABB3 ЗВОНОК NZ, PLOT_ROW; И снова, если с помощью двойной высоты B497 CD6CB1 ЗВОНОК PAGE_0; Восстановление RAM страницу нулевой B49A D1 POP DE; DE указывает на расширение пикселей B49B F1 POP AF; = счетчик цикла B49C 3D декабря B49D 20D8 JR NZ, PCHRLOOP2; Распечатать весь характер B49F E1 POP HL; HL = исходное положение печати B4A0 DD7E16 LD, (IX + W_PIX); = исходное положение в квадрате B4A3 DD8617 ADD A, (IX + W__CH_WID); Разрешить для ширины символа B4A6 FE08 PCHR_POS CP # 08 B4A8 3805 JR C, PCHR_POS2; Перейти если позиция печати ОК B4AA D608 SUB # 08 B4AC 23 INC HL; иначе изменить его B4AD 18F7 JR PCHR_POS; Loop вернуться, чтобы попробовать еще раз B4AF DD7716 PCHR_POS2 LD (IX + W_PIX),; магазин новая позиция в квадрате B4B2 CD9AB3 PCHR_EXIT ЗВОНОК STOREADDR; магазин новая позиция печати B4B5 DD340C INC (IX + W_XCOORD); приращение координаты х B4B8 F1 POP AF; = персонаж просто напечатаны B4B9 C9 RET; возврат

Следующая подпрограмма будет опустошения буфера (“медленные” только для Windows), печать бывшие содержимое на окне.

B4BA D4BBB2 ПУСТО ЗВОНОК NC, ENTER; перехода на новую строку при необходимости

B4BD DDE5 PUSH IX B4BF E1 POP HL; точки HL для канала инфо блок B4C0 011D00 LD BC, # 001D B4C3 09 ДОБАВИТЬ HL, BC; HL указывает на переменную W_LEN B4C4 7E LD, (HL); = количество символов в буфер B4C5 A7 И B4C6 C8 EMPTYLOOP RET Z; Возврат, если закончил B4C7 23 INC HL; HL указывает на следующий гольца в буфер B4C8 7E LD, (HL) B4C9 E5 PUSH HL B4CA CDF4B0 ЗВОНОК CTYP_NTOK; Флаги указывают тип характера B4CD CDDCB3 ЗВОНОК PRINT_CHR; Печать символа B4D0 E1 POP HL B4D1 DD351D DEC (IX + W_LEN) B4D4 18F0 JR EMPTYLOOP

Следующая подпрограмма будет опустошения буфера (“Slow”) или сделать Nothin (“Fast”). Это будет решать, требуется ли или нет новая строка, и распечатать его, если так.

B4D6 DDCB0B66 EMPTY_2 БИТ 4, (IX + W_FLAGS)

B4DA C8 RET Z; Возвращение с “Fast” окон B4DB 57 LD D, A; D = следующий символ для печати B4DC DD7E1D LD, (IX + W_LEN); = длина слова в буфер B4DF DD860C ADD A, (IX + W_XCOORD); A = потенциальные координаты х после                                            ; Буфер была очищена B4E2 DDBE0D CP (IX + W_WIDTH) B4E5 2002 JR NZ, EMPTY_OUT; Перейти если слова точно заполняет строку B4E7 53 LD D, E, D = альтернатива символ для печати B4E8 37 SCF; Сигнал “Новая строка не нужен” B4E9 D5 EMPTY_OUT PUSH DE B4EA C5 PUSH BC B4EB CDBAB4 ЗВОНОК ПУСТО; Пустой буфер с новой строки, если это необходимо B4EE C1 POP BC B4EF F1 POP AF; = следующий символ для печати B4F0 C9 RET; возврат

И вот, наконец, у нас есть саму выходной подпрограмму окно.

B4F1 DD2A515C окно LD IX, (CURCHL); IX указывает на канал инфо блок

B4F5 CDB7B0 ЗВОНОК CHR_TYPE; Сделка с ключевыми словами и т.д.

B4F8 F8 RET M; Возврат, если задачи завершены B4F9 F5 PUSH AF; Стек характер для печати B4FA 2824 JR Z, WIND_ABLE; Перейти с графическими символами B4FC 3013 JR NC, WINDASCII; Перейти с персонажами ASCII B4FE A7 И B4FF CC92B2 ЗВОНОК Z, CLSWINDOW; Очистить окно CHR $ 0 B502 F1 POP AF B503 F5 PUSH AF B504 5F LD E, A; Сигнал “Чар не менять” B505 CDD6B4 ЗВОНОК EMPTY_2; Пустой буфер B508 CD32B1 ЗВОНОК CHRTYPE2A; Сделка с TAB и запятыми контроля B50B CD33B3 WIND_CTRL соединения контролирует; Сделка с остальными персонажами Ctrl B50E F1 POP AF B50F A7 И; Сброс флага переноса B510 C9 RET; возврат B511 FE20 WINDASCII СР “пространство” B513 200B JR NZ, WIND_ABLE; Перейти со всеми символов, кроме “пространство” B515 1E0D LD E, “ввести”; Использование “введите” как альтернативного гольца B517 CDD6B4 ЗВОНОК EMPTY_2; Пустой буфер B51A FE0D СР “введите” B51C 28ED JR Z, WIND_CTRL; Перейти если сейчас требуется новая строка B51E 1806 JR WINDPRINT; Перейти к печати “пространство” на окне B520 DDCB0B66 WIND_ABLE БИТ 4, (IX + W_FLAGS) B524 2004 JR NZ, # B52A; Перейти с “медленным” окон B526 F1 WINDPRINT POP AF B527 C3DCB3 JP PRINT_CHR; Перейти печатать характер B52A 2A515C WIND_SLOW LD HL, (CURCHL); HL указывает на канал инфо блок B52D 011D00 LD BC, # 001D B530 09 ДОБАВИТЬ HL, BC; HL указывает на переменную W_LEN B531 7E LD, (HL); = количество символов в буфер B532 DDBE0D CP (IX + W_WIDTH) B535 2005 JR NZ, WINDSLOW2; Перейти если буфер полной B537 E5 PUSH HL B538 CDBAB4 ЗВОНОК ПУСТО; Пустой буфер B53B E1 POP HL B53C F1 WINDSLOW2 POP AF B53D 34 INC (HL); длина Прирост буфер B53E 4E LD C, (HL) B53F 0600 LD B, # 00; BC = новая длина буфера B541 09 ДОБАВИТЬ HL, BC B542 77 LD (HL), A; магазин символ в буфер B543 C9 RET; возврат

; [Следующая подпрограмма получает перезаписаны кода в части 4 JimG]

И, наконец, – просто быстрая программа демонстрации, чтобы открыть окно и приложите его

поток четыре. Если вы запустите это, вы будете иметь возможность использовать PRINT # 4; для печати на окно.

B544 3E04 WIND_DEMO LD A, # 04

B546 08 EX AF, AF ‘;’ = номер потока B547 2A7B5C LD HL, (УДГ); HL = адрес пользовательских графики B54A 0180FF LD BC, # FF80 B54D 09 ДОБАВИТЬ HL, BC B54E 44 LD B, H B54F 4D LD C, L; BC ‘= адрес UDGs – 80h B550 ED5B365C LD DE, (знаков); De ‘= адр нормального набор символов – 100h B554 2607 LD H, # 07, H = ширина символов B556 D9 EXX B557 3E31 LD A, # 31; = атрибут байт для окна B559 010102 LD BC, # 0201; BC = позиция окна B55C 111808 LD DE, # 0818; DE = размер окна B55F 21FFFF LD HL, # FFFF; HL сигналы “Slow оконные” и                                            ; “Scroll пауза позволила” B562 CD12B2 ЗВОНОК OPEN_WIND; Откройте окно канал B565 215827 LD HL, # 2758 B568 D9 EXX; HL = значение требует BASIC B569 C9 RET; возврат

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

Описание Streams and Channels (автоматический перевод)

1 2 3 4 5 6 7 8

ВОДОТОКИ И КАНАЛЫ

Тони Бейкер часть 4 из 5, ZX Computing марта 1987

Если вы думали, что вы не могли использовать принтер ZX

с вашим новым 128, то Тони Бейкер можете доказать, что вы неправы.

[Обратите внимание, что код в STREAMS.TAP “ч.4”]

[Включает код с “часть3”. JimG]

Эта статья содержит не один, а два новых каналов, которые вы можете использовать,

на Spectrum. Первый канал, который позволяет пользователям Спектр 128 (или 128 + 2), чтобы иметь возможность использовать принтер ZX – или некоторые другой совместимый принтер, таких как AlphaCom – даже в режиме 128К. Если Вы не имеете Spectrum 128, то вам не нужно это новый канал Конечно, потому что вы можете использовать принтер ZX в любом случае.

Во-вторых, на самом деле не новый канал вообще, но модификация

существующий канал. Это позволяет Spectrum, чтобы иметь возможность общаться свободно с QL через локальную сеть доступной из ZX Интерфейс Один. Конечно связь между этими компьютерами через Сеть уже можно, и Дэвид Nowotnik в последнее время делает отличную серию в ZX Computing на том самом задачи. Это не В мои намерения дублировать любой из его материала, но лишь для удаления Пару недостатков в самого канала. Мы вернемся к этому позже, в то время вернуться к принтеру ZX.

Канал Z

Программа как таковая начинается с адреса B544. Если это кажется довольно

произвольное обращение к вам, то я должен объяснить, что причина его начинается с B544 является то, что весь код вытекает из материала в прошлом Статья месяца (которая проходила с B000 на B543). В самом деле, некоторые из подпрограммы, разработанные в прошлом месяце, будут использованы в подпрограммах, приведенных здесь.

Хитрость с помощью принтера ZX на 128, чтобы избежать какой-либо

Возможность удаления или развращает старый буфер принтера (адреса 5B00 для 5BFF) – это потому, что память в этом диапазоне используется 128 для хранения различных подкачки подпрограммы, системных переменных, а также Альтернативный стек машина для использования при доступе обширные банки По стр памяти. Если мы можем сделать так, чтобы мы могли избежать развращает эта память, то старый добрый ZX Printer может еще работать нормально. Ты см, все программное обеспечение принтера ZX в ПЗУ была написана до того, Появление 128 и не совместим с требованиями Новая машина.

Все, что мы действительно должны сделать, это создать новый буфер принтера

где-то в памяти, и использовать новый буфер вместо старого.

Наилучший возможный место для этого буфера будет как часть Информационный блок канала для канала – это будет означать, что Площадь, занимаемая новый буфер принтера будет утилизирован, когда Вы закрыт канал.

Мы будем называть этот новый канал “Z”, для ZX-принтера. Посмотреть на

Рисунок Один – это показывает структуру информационного блока канала для нового канала. Как вы можете видеть, первый одиннадцать байт магазин полностью стандартная информация, с помощью стандарта, который был разработаны в этой серии. (IX + 05/06) содержит константу 1234h, который идентифицирует это как канал определяется пользователем. Это означает, что она может быть открыта или закрыта с помощью некоторых программ перечислены в прошлом месяце (IX + 0B), (IX + 0C) и (IX + 0D) также хранить информацию в том же формате, что и “W” канала заданного в прошлом месяце – это так что мы можем использовать более подпрограмм в прошлом месяце. Как вы должны см, коллекция новых каналов гораздо более выгодным, чем один новый канал.

Наконец, сам новый буфер принтера запускается с (IX + 0Е) вверх, и

является 100h байт (те же, что и старый буфер принтера). Переменная Z_XCOORD (IX + 0C) будет равна нулю, если буфер принтера полностью пусто, или не ноль в противном случае. Если новый буфер заполнен он будет содержать 20h. Z_WIDTH (IX + 0D) остается постоянным в 20 часов – ширина буфер. Это объясняется тем, что TAB и запятыми контроля процедуры от в прошлом месяце, может быть успешно использована.

Программа начинается на этикетке Z_CLOSE, который является обычным для

выполнять все периферийные задач, необходимых для закрытия канала. В Фактически это просто состоит из испытаний, является ли буфер пусто, и печати на новую строку, если это не так.

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

Рисунок 1

IX + 00 (2 байта) Z_PRINT Адрес канала “Z” выход

IX + 02 (2 байта) REPORT_J Адрес канала “Z” вход IX + 04 (1 байт) Z_NAME Название канала (то есть. “Z”) IX + 05 (2 байта) Z_IDEN Постоянная 1234h определяет новый канал IX + 07 (2 байта) Z_CLOSE Адрес тесном рутины буфера IX + 09 (2 байта) Z_LEN Длина информации канала (т.е.. 010E) IX + 0B (1 байт) Z_FLAGS Различные флаги         Бит 7: Установите, если ведущий пространство не reqd. по ключевым словам, сброс в противном случае         Бит 6: Не используется         Бит 5: Не используется         Бит 4: Не используется         Бит 3: Установите, если статус INVERSE включен, сброс в противном случае         Бит 2: Установите, если статус НАД включен, сброс в противном случае         Бит 1: Установите, если ровно два дополнительных параметра reqd, сброс в противном случае.         Бит 0: Устанавливается, если ровно один дополнительный параметр reqd, сброс в противном случае. IX + 0С (1 байт) Z_XCOORD координаты Х положение печати в буфер IX + 0D (1 байт) Z_WIDTH Ширина буфера (т.е.. 20h) IX + 0E (100h байт) Z_BUFFER Новый буфер принтера – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

Новая строка

Процедура Z_NEWLINE может быть по сравнению с обычной ROM COPY_BUFF на

обратиться 0ECD. Его цель заключается в передаче содержимого буфера Сам принтер ZX, пока, наконец, стирая предыдущий буфер содержание. Процедура Z_EMPTY делает фактическую стирание. Вы заметите, пару различий между ROM рутинной COPY_BUFF и мой подпрограмма Z_NEWLINE. Во-первых, новый буфер принтера используется вместо старый, а во-вторых подпрограмма Z_COPY_LINE называется вместо оригинального COPY_LINE.

На самом деле Z_COPY_LINE сама по себе очень похож на COPY_LINE ПЗУ в

рутина (в 0EFA). Единственное различие в данных является эффект нажав клавишу BREAK – в моей рутинной Z_EMPTY называется вместо CLEAR_PRB. Это устраняет любые возможные шансы развращает старый Площадь буфер принтера.

Подпрограмма общего назначения входит в следующем – SEARCH_CH_ALL. Здесь

вошел в реестре А, содержащего имя канала.

подпрограмма будет искать через канал области информационной ищет Канал с таким именем. Если он находит он вернется с IX указывая на информационном канале блока и сброса переноски, в противном случае перенос будет установлен. Мы воспользуемся этой подпрограммы позже.

Z_PRINT

Z_PRINT является рутину, которая “печатает” персонаж провел в А

зарегистрируйтесь на новый буфер принтера. Следует отметить, что подпрограмма по крайней адрес B12F происходит от предыдущей статье и будет разобраться во всех ключевые слова, параметры управления, и будет иметь дело с так запятыми управления и функция TAB. По возвращении из этой подпрограммы С регистр будет содержать каких-либо обратных или по параметрам, или х координата любой AT параметров. Сам рутина Z_PRINT действительно довольно просто, имея в виду, что он имеет дело с ASCII персонажи, блок графики и UDGs, а также OVER, INVERSE, AT и ENTER. Следуйте его через чтобы увидеть, как все различные случаи рассматриваются.

Наконец (для этого канала) мы имеем Z_OPEN, который открывает канал и

присоединяет его к потоку. На входе, регистр должен содержать номер потока в который преобразуется канал должен быть прикреплен и Подпрограмма будет делать все остальное. Это делает использование другой подпрограммы из Последняя статья – OPEN_NEW рутина, которая откроет пользовательские каналы.

Канал Q

При общении с QL через обычный сетевой канал, который вы будете

заметить несколько проблем. Во-первых, на Spectrum Код для “введите” является 0D (тринадцать), в то время как на QL кода для “Введите” является 0A (десять). Это означает, что, например, PRINT A $ на QL не могут быть сопоставлены с помощью входного $ на Spectrum, ни наоборот. Здесь Обычно необходимо использовать напечатать $; CHR $ (13); на QL для того, чтобы Спектр может использовать ВХОД $. И наоборот, INPUT $ на QL нужно быть подкреплены PRINT A $; CHR $ 10; на Spectrum.

То, что я собираюсь сделать, это изменить канал “N”, прикрепленный к

Поток частности так, что недостатки будут удалены. В модифицированный Канал “N” эти проблемы исчезают. PRINT $ на Spectrum может быть сопровождаться ВХОД $ на QL, и наоборот. Другим удивительным Преимущества появиться; Если указать программу Spectrum над собой модифицированный Сеть каналов, то QL смогут загрузить программу с Одна команда НАГРУЗКИ NET1_2 (при условии, что Спектрум станция № 2) – или передать программу непосредственно на Microdrive QL готово к погрузке позже с одной QL команда копирования NET1_2 К MDV1_PROG.

Вторая проблема является немного более сложным, но не очень.

Команда спектра входного $ самом деле рассчитывает получить строку выражение, а не содержание фактической строки (хотя это не в случае с входной линии). К счастью для нас, мы редко замечали это потому Спектр предоставляет на окружающие кавычки – Это превращает строка текста в текстовой строки, и все это работяга доры – С одним исключением. Если строка печатается по сети со стороны QL содержит цитаты характер, то спектр будет не в состоянии оценить результат как строковое выражение и остановится с ошибкой “C Ерунда в BASIC “. Лечение этой проблемы очень простое. Если, во входной спектр (в отличие от INKEY $ или линейный вход) через котировки характер полученных от модифицированной сети канала то она должна быть Преобразуются в два последовательных котировок символов в порядке, что Выражение будет еще оценить.

Давайте взглянем на подпрограмм сейчас. Начнем с SHADOW_DE

который будет вызывать подпрограмму в ПЗУ Shadow, чей адрес является DE. Это Это достигается путем обмана Спектрум, думая, что мы возвращаясь к Shadow ROM из подпрограммы Spectrum, а затем просто подкачки из Теневое ПЗУ на завершение.

Q_PRINT является подпрограмма, которая “печатает” персонаж более модифицированный

сеть. Как вы можете видеть, что это очень просто, всего лишь тест на “Введите” характер и преобразования таких, чтобы 0A, прежде чем использовать оригинал Тень-ПРИНТ подпрограмма печатать характер.

Q_INPUT является более сложным, хотя и не так сильно. Во-первых, подпрограмма

тесты возвращение адрес ошибки, чтобы увидеть, является ли введенный символ является из-за ввода команды, или из-за INKEY $ функции. Если выяснится, чтобы быть просто INKEY $, то вещи просто так прост, как для Q_PRINT.

Тень вход подпрограмма вызывается прочитать характер, и если что характер 0A затем он преобразуется в “введите”.

Если, однако, мы имеем дело с ввода (в отличие от INKEY $), то

Первое, что мы должны сделать, это отказаться вообще использовать рутины РЕДАКЦИЮ в ПЗУ (который мы делаем, освобождая стек машины, насколько вернуться адрес от вызова редактора), а затем поставлять новую рутину заменить редактора. Мы можем назвать Q_INKEY $ в виде подраздела рутины, чтобы выборки один символ из сети (преобразования 0A к 0D) и флаги скажет нам, если персонаж действует или нет. Тогда мы можем назвать ROM Подпрограмма ADD_CHAR_1 на самом деле вставить символ на вход линия. Цитировать символы должны быть вставлены в два раза, не один раз (за исключением Линейный вход). Наконец, если символ “ввести” будет получен, то мы можем вернуться, как будто от рутины редактор, с готовой строки Выражение в области ввода оперативной памяти.

MODIFY_N является подпрограмма, которая будет преобразовывать канал “N”, чтобы сделать, как это

сказал. На входе регистр должен содержать номер потока существующий канал “N”, который должен быть открыт в обычном режиме. В такой Канал (IX + 00/01) и (IX + 02/03), как правило, содержат значение 0008 которые, если называется, будет страница в Shadow ROM, а затем вызвать фактические выход или вход подпрограммы рассмотрены (IX + 05/06) и (IX + 07/08) соответственно.

MODIFY_N подпрограмма будет просто конвертировать эти 0008s для Адреса Q_PRINT и Q_INPUT, оставляя адреса тени Процедуры без изменений. Подпрограммы Shadow будет называться только тогда, когда требует Q_PRINT или Q_INPUT.

Наконец, пять байт демонстрация канала “Z”. Просто вызова

Z_DEMO от BASIC откроет новый канал “Z”, и прикрепить его на поток номер четыре.

Канал R

В следующей, заключительной части этой серии статей мы рассмотрим использование

существующий канал “R”, которые могут только быть использованы либо в машинный код. Мы также будем создавать новый канал, называемый также “R” (R для RAM-диск), который позволит Вам создать чтения и записи файлов в Площадь RAM-диск Spectrum 128, так же как вы можете на микродрайвы. До Затем, улыбаться, и не принимать ничего серьезно.

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

B544 DD7E0C Z_CLOSE LD, (Z_XCOORD); = х координат в буфер B547 A7 И B548 C8 RET Z; Возврат немедленно, если буфер пуст

B549 DDE5 Z_NEWLINE PUSH IX

B54B E1 POP HL; HL = адрес информации канала B54C 010E00 LD BC, # 000E B54F 09 ДОБАВИТЬ HL, BC; HL указывает на новый буфер принтера B550 F3 DI; Запретить прерывания B551 0608 LD B, # 08 B553 C5 Z_NL_LOOP PUSH BC B554 CD73B5 ЗВОНОК ZCOPYLINE; выход в следующий ряд, чтобы ZX Printer B557 C1 POP BC B558 10F9 DJNZ Z_NL_LOOP; выход все восемь строк B55A 3E04 LD A, # 04 B55C D3FB OUT (#FB), только выключить двигатель принтера B55E FB EI; Разрешить прерывания

B55F DDE5 Z_EMPTY PUSH IX

B561 E1 POP HL; HL = адрес информации канала B562 010E00 LD BC, # 000E B565 09 ДОБАВИТЬ HL, BC; HL указывает на новый буфер принтера B566 AF XOR; = 00 B567 77 ZEMPTLOOP LD (HL), A; Ноль следующий байт буфера B568 23 INC HL; HL указывает на следующий байт в буфер B569 10FC DJNZ ZEMPTLOOP; Ноль весь буфер B56B DDCB0BFE SET 7, (Z_FLAGS); Сигнал “Ведущий пространство не требуется” B56F DD770C LD (Z_XCOORD),; Сброс координаты х в буфер B572 C9 RET; возврат

B573 78 ZCOPYLINE LD A, B; A = номер строки для вывода

B574 FE03 CP # 03 B576 9F SBC,; = FF (последние 2 строки); 00 (в противном случае) B577 E602 И # 02; = 02 (последние 2 строки); 00 (в противном случае) B579 D3FB OUT (#FB),; Включить двигатель принтера, но с                                            ; Медленная скорость для последних двух строках B57B 57 LD D, A; D = “последние 2 строки” флаг B57C CD541F Z_CL_LOOP ЗВОНОК BREAK_KEY; Тест ключевым ПЕРЕРЫВ B57F 380A JR C, Z_CL_NEXT; переход вперед, если не нажата ПЕРЕРЫВ B581 3E04 LD A, # 04 B583 D3FB OUT (#FB), только выключить двигатель принтера B585 FB EI; Разрешить прерывания B586 CD5FB5 ЗВОНОК Z_EMPTY; Слейте новый буфер принтера B589 CF RST # 08; Отчет “D, ПЕРЕРЫВ – CONT повторяет” B58A 0C DEFB # 0C B58B DBFE Z_CL_NEXT IN A, (# FE); = статус принтера B58D 87 ДОБАВИТЬ, B58E F8 RET M; Возврат, если принтер не подключен B58F 30EB JR NC, Z_CL_LOOP; Подождите, пока стилус принтер не готов B591 C3120F JP COPY_L_2A Перейти печатать следующую строку из буфера

B594 DD2A4F5C поискВсе LD IX, (CHANS); IX указывает на базе чан информационной области

B598 011400 LD BC, # 0014 B59B 57 LD D, A; D = название канала для поиска B59C DD09 SCHCHLOOP ДОБАВИТЬ IX, BC; IX указывает на следующий инфо чан области B59E DD7E00 SEARCH_CH LD, (IX + # 00) B5A1 FE80 CP # 80 B5A3 37 SCF B5A4 C8 RET Z; Возвращение с Carry устанавливается, если канал                                            ; Не найдено B5A5 DD7E04 LD, (IX + # 04); = название канала указал на B5A8 BA CP D B5A9 C8 RET Z; Возвращение с IX указывая канализировать                                            ; Область информации, и Carry сбросить,                                            ; Если поиск успешным B5AA DD4E09 SEARCHNXT LD C, (IX + # 09) B5AD DD460A LD B, (IX + # 0A); BC = длина информации канала B5B0 18EA JR SCHCHLOOP; Loop назад, чтобы продолжить поиск

B5B2 DD2A515C Z_PRINT LD IX, (CURCHL); IX указывает на канал инфо область

B5B6 CD2FB1 ЗВОНОК CHR_TYPE2; Сделка с ключевыми словами, контроль Params,                                            ; TAB и запятая управления B5B9 F8 RET M; Возврат, если задачи полная B5BA F5 PUSH AF B5BB 283B JR Z, ZGRAPHICS; Перейти с графическими символами B5BD 3033 JR NC, Z_ASCII; Перейти с персонажами ASCII B5BF FE0D CP # 0D B5C1 2005 JR NZ, Z_PRCTRLS; Перейти если гольца является “введите” B5C3 CD49B5 ЗВОНОК Z_NEWLINE; перехода на новую строку B5C6 187F JR Z_EXIT; и прыгать, чтобы выйти B5C8 D614 Z_PRCTRLS SUB # 14 B5CA 387B JR C, Z_EXIT; Перейти с контролем 00 до 13 B5CC 0608 LD B, # 08; B имеет битовый 3 набор B5CE 2805 JR Z, Z_INVOVER; Перейти с “обратной контроля” B5D0 3D декабря B5D1 0604 LD B, # 04; B имеет бит 2 набора B5D3 200F JR NZ, Z_AT; Перейти если гольца является “контроль над” B5D5 CB19 Z_INVOVER RR C B5D7 9F SBC,; = 00 (INVERSE 0 или больше 0)                                            ; Или FF (INVERSE 1 или более 1) B5D8 DDAE0B XOR (Z_FLAGS); A = флаги байт, но дополнены если                                            ; Параметр является одним B5DB A0 И B; A все биты сбрасываются, кроме того, что бит                                            ; 3 (обратный) или бит 2 (НАД) будет                                            ; Взято из флагов байта, и                                            ; Дополнен, если параметр является одним B5DC DDAE0B XOR (Z_FLAGS) B5DF DD770B LD (Z_FLAGS),; Бит 3 (обратный) или бит 2 (НАД) из                                            ; Флаги байт будет присвоен                                            ; Параметр B5E2 1863 JR Z_EXIT; Перейти, чтобы выйти B5E4 3D Z_AT декабря B5E5 2060 JR NZ, Z_EXIT; Перейти если контроль является “AT контроля” B5E7 79 LD A, C; A = необходимые координаты х B5E8 FE20 CP # 20 B5EA D29F1E JP NC, REPORT_B; Ошибка, если вне диапазона B5ED DD770C LD (Z_XCOORD),; Назначить х координат в соответствии с требованиями B5F0 1855 JR Z_EXIT; Перейти, чтобы выйти B5F2 ED5B365C Z_ASCII LD DE, (знаков); DE = эл набора символов – 100h B5F6 1811 JR Z_CHR_1; переход вперед B5F8 D690 ZGRAPHICS SUB # 90 B5FA 3009 JR NC, Z_UDG; Перейти с пользовательскими графики B5FC 47 LD B, B5FD CD380B ЗВОНОК PO_GR_1; Построить графики в MEMBOT области B600 21925C LD HL, MEMBOT; HL указывает на графическом виде B603 180B JR Z_CHR_2; переход вперед B605 ED5B7B5C Z_UDG LD DE, (УДГ); DE = адрес пользовательских графики B609 6F Z_CHR_1 LD L, B60A 2600 LD H, # 00 B60C 29 ДОБАВИТЬ HL, HL B60D 29 ДОБАВИТЬ HL, HL B60E 29 ДОБАВИТЬ HL, HL B60F 19 ДОБАВИТЬ HL, DE; HL указывает на требуемой графической форме B610 DD7E0C Z_CHR_2 LD, (Z_XCOORD); A = текущие координаты х в буфер B613 FE20 CP # 20 B615 E5 PUSH HL B616 CC49B5 ЗВОНОК Z, Z_NEWLINE; перехода на новую строку, если буфер полон B619 D1 POP DE; DE указывает на графическом виде B61A DD7E0C LD, (Z_XCOORD); A = текущие координаты х в буфер B61D 3C INC; A = новый координаты х B61E DD770C LD (Z_XCOORD),; Хранить в системной переменной B621 C60D ДОБАВИТЬ, # 0D B623 4F LD C, B624 0600 LD B, # 00; BC = смещение к POSN в буфер B626 DDE5 PUSH IX B628 E1 POP HL; точки HL для канала информации B629 09 ДОБАВИТЬ HL, BC; HL указывает на текущий POSN в буфер B62A 0608 LD B, # 08 B62C EB Z_CHRLOOP EX DE, HL; DE = позиция текущий буфер                                            ; HL указывает на графическом виде B62D 1A LD, (DE); = байт из буфера B62E DDCB0B56 БИТ 2, (Z_FLAGS) B632 2001 JR NZ, Z_CHROVER; Перейти если OVER от B634 AF XOR B635 DDCB0B5E Z_CHROVER БИТ 3, (Z_FLAGS) B639 2801 JR Z, Z_CHR_INV; Перейти если INVERSE на B63B 2F CPL B63C AE Z_CHR_INV XOR (HL); = байт из графической форме, с                                            ; OVER и обратные учитывать B63D 12 LD (DE), A; Хранить в буфер B63E E5 PUSH HL; указатель стека в графической форме B63F 212000 LD HL, # 0020 B642 19 ДОБАВИТЬ HL, DE; HL указывает на необходимый байт в                                            ; Буфер для следующего ряда характера B643 D1 POP DE; DE указывает на графическом виде B644 13 INC DE; DE указывает на следующий байт использовать B645 10E5 DJNZ Z_CHRLOOP; Распечатать весь характер в буфер B647 F1 Z_EXIT POP AF; = персонаж просто напечатаны B648 A7 И; Сброс флага переноса B649 C9 RET; возврат

B64A 08 Z_OPEN EX AF, AF ‘;’ = номер потока прикрепить канал

B64B 3E5A LD, “Z” B64D CD94B5 ЗВОНОК поискВсе; поиск другой канал “Z” B650 D2C415 JP NC, REPORT_J; Ошибка, если он существует B653 DD2144B5 LD IX, Z_CLOSE; IX = близко адрес буфера B657 21B2B5 LD HL, Z_PRINT; HL = выходной адрес B65A 11C415 LD DE, REPORT_J; DE = ввод адреса B65D 010E01 LD BC, # 010E; BC = длина информации канала B660 CD6DB0 ЗВОНОК OPEN_NEW; Откройте канал B663 DD360B00 LD (Z_FLAGS), # 00; Сброс флагов B667 DD360D20 LD (Z_WIDTH), # 20; Укажите ширина буфера = 20ч символы B66B C35FB5 JP Z_EMPTY; Пустой буфер, и возвращение

B66E 210007 SHADOW_DE LD HL, UNPAGE

B671 E5 PUSH HL; Стек UNPAGE адрес в Shadow ROM B672 D5 PUSH DE; Стек Shadow подпрограмма адрес B673 65 LD H, L; HL = 0000 B674 E5 PUSH HL; Stack 0000 сигнализации “Возвращение к                                            ; Shadow ROM адрес ” B675 C30800 JP # 0008; Перейти называть темной подпрограмму

B678 DD2A515C Q_PRINT LD IX, (CURCHL); IX указывает на канале информации

B67C F5 PUSH AF; Стек характер для печати B67D FE0D СР “введите” B67F 2002 JR NZ, Q_PRINT_2; Перейти если характер является “введите” B681 3E0A LD A, # 0A; = код QL для “введите” B683 DD5E05 Q_PRINT_2 LD E, (IX + # 05) B686 DD5606 LD D, (IX + # 06); выходной адрес DE = Shadow B689 CD6EB6 ЗВОНОК SHADOW_DE; Позвоните сети выход в Shadow ROM B68C F1 POP AF; = персонаж просто напечатаны B68D A7 И; Сброс флага переноса B68E C9 RET; возврат

B68F DD2A515C Q_INPUT LD IX, (CURCHL); IX указывает на канале информации

B693 2A3D5C LD HL, (ERR_SP); HL указывает на ошибки обратный адрес B696 5E LD E, (HL) B697 23 INC HL B698 56 LD D, (HL); DE = возврат ошибка адрес B699 217F10 LD HL, ED_ERROR B69C A7 И B69D ED52 SBC HL, DE B69F 2814 JR Z, Q_INPUT_2; Перейти если во входном канале B6A1 DD5E07 Q_INKEY $ LD E, (IX + # 07) B6A4 DD5608 LD D, (IX + # 08); ввод адреса DE = Shadow B6A7 CD6EB6 ЗВОНОК SHADOW_DE; Позвоните сети вход от Shadow ROM B6AA 47 LD B, A; B = персонаж просто вход B6AB F5 PUSH AF; Стек флаги B6AC FE0A CP # 0A B6AE 2002 JR NZ, Q_INKEY $ 2; Перейти если это QL “введите” B6B0 060D LD B, # 0D; B = Спектр “введите” характер B6B2 F1 Q_INKEY $ 2 POP AF; восстановление флаги B6B3 78 LD A, B; A = символ, чтобы вернуться B6B4 C9 RET; возврат B6B5 ED7B3D5C Q_INPUT_2 LD SP, (ERR_SP); Слейте машина стек вниз, как                                            ; Насколько ED_ERROR B6B9 E1 POP HL; Брось адрес ED_ERROR B6BA E1 POP HL; HL = обычный возврат ошибка адрес PTR B6BB 223D5C LD (ERR_SP), HL; восстановление указатель ошибки обратный эл B6BE CDA1B6 Q_INPLOOP ЗВОНОК Q_INKEY $; прочитанными следующий символ из сети B6C1 3804 JR C, QINPSTORE; Перейти если характер ОК B6C3 28F9 JR Z, Q_INPLOOP; Перейти если еще ждут B6C5 CF RST # 08; Отчет “8, конец файла” B6C6 07 DEFB # 07 B6C7 FE0D QINPSTORE CP # 0D B6C9 C8 RET Z; Возврат (INPUT теперь закончена), если                                            ; Символ “введите” B6CA CD850F ЗВОНОК ADD_CHAR_1; Храните символ в строке ввода B6CD FDCB377E BIT 7, (FLAG_X) B6D1 20EB JR NZ, QINPLOOP; Loop назад, если делать Линейный вход B6D3 FE22 CP # 22 B6D5 CC850F ЗВОНОК Z, ADD_CHAR_1; Дважды до кавычку B6D8 18E4 JR Q_INPLOOP; Вернитесь на остальной ВХОД

B6DA CD2117 MODIFY_N ЗВОНОК STR_DATA1; BC = STRMS данных для потока, поставляемые

B6DD 78 LD A, B B6DE B1 ИЛИ С B6DF 280C JR Z, MOD_ERROR; Ошибка, если поток не используется B6E1 2A4F5C LD HL, (CHANS); HL указывает на базе чан информационной области B6E4 09 ДОБАВИТЬ HL, BC; HL указывает на второй байт информации чан B6E5 23 INC HL B6E6 23 INC HL B6E7 23 INC HL; HL указывает на пятом байте информации чан B6E8 7E LD, (HL); = название канала B6E9 FE4E СР “N” B6EB 2802 JR Z, MOD_QL; Перейти, только если канал “N” B6ED CF MOD_ERROR RST # 08; Отчет «О, Неверный поток” B6EE 17 DEFB # 17 B6EF 2B MOD_QL декабря HL B6F0 36B6 LD (HL), # B6 B6F2 2B декабря HL B6F3 368F LD (HL), # 8F; магазин новый ввод адреса B6F5 2B декабря HL B6F6 36B6 LD (HL), # B6 B6F8 2B декабря HL B6F9 3678 LD (HL), # 78; магазин новый выход адрес B6FB C9 RET

; [Этот последний бит кода получает перезаписаны кода в части 5. JimG]

B6FC 3E04 Z_DEMO LD A, # 04; число = поток прикрепить

B6FE C34AB6 JP Z_OPEN

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

Описание Streams and Channels (автоматический перевод)

1 2 3 4 5 6 7 8

ВОДОТОКИ И КАНАЛЫ

Тони Бейкер часть 5 из 5, ZX Computing апреля 1987

В этом месяце, Тони Бейкер открывает новый

канала на 128 в RAMdisc объекта.

[Обратите внимание, что код в STREAMS.TAP “part5”] [Включает код с “ч.4”. JimG]

Это заключительная часть в серии Streams и каналов, и это статья для людей, которые владеют либо Spectrum 128 или Spectrum 128 + 2. Новый канал в этом месяце вводит СЕРИЙНЫЕ файлы в 128К машины.

Люди, которые имеют интерфейса Ones и Microdrives уже будут использованы для серийные файлы на Microdrive картриджа. В этом случае при открытии Микродиск файл либо в виде файла READ (если файл уже существует на Microdrive) или запись в файл (в этом случае файл должен быть создан на Microdrive). Вы можете печатать текст в файл записи, а затем закройте и Откройте его (так, что она становится чтения файла) и вы можете затем ввести Текст как строки или числа в основной переменной.

RAMdisc

RAMdisc файлы работа в точности так же, за исключением того, что вам не нужно Интерфейс Один. Когда вы впервые открываете файл RAMdisc для письма, в файл с заданным именем создается на так называемой «кремний спектра в Диск “. Текст или цифры могут быть напечатаны в этом файле. После того, как канал закрывается не более печать в файл не возможно. Файл может, однако, быть вновь открыта в качестве файла для чтения, и в этом случае все, что находится в файле могут быть введены в основной переменной.

Как с Microdrive файлов, RAMdisc файлы должны быть закрыты, как только все данные были напечатаны, или поступающей от файла. Если файл записи не закрыт, то некоторые или все данные могут быть потеряны, поскольку это не будет очищены из специального буфера. Если файл READ не закрыта, Последствия менее серьезны, однако, каждый канал RAMdisc требуется более 1 / 2K, который может быть восстановлена ​​только путем закрытия файла. Ты должен всегда закрывать такой файл, как только вы закончили с ним.

После того, как файл был открыт, он появится в каталоге RAMdisc, которые вы можете проверить, набрав CAT! в BASIC. Невозможно загрузить Серийный файл RAMdisc помощью команды ЗАГРУЗИТЬ, однако можно УДАЛЕНИЕ серийный файл RAMdisc в обычном порядке, введя ERASE!

“Имя файла”. Вы никогда не должны стирать серийный файл RAMdisc который все еще в использовании (т.е.., которые до сих пор поток прилагается к нему). машинный код программы, на деле защитить себя от этого в конечном счете, так такая ошибка не будет фатальным – однако, вы непременно получите ложные результаты, если вы нарушите это правило.

Кремний диск

Ключ к, как программа работает машинный код является манипулирование

организация памяти известен как кремний диска или RAMdisc, который Обычно используется для сохранения программ, данных или машинный код для до тех пор, как машина включена. RAMdisc файлы намного быстрее, чем Microdrive файлы, но вся RAMdisc стирается, когда машина выключен. Серийные файлы RAMdisc будет, конечно, страдают от именно эти преимущества и недостатки.

Сам памяти RAMdisc прежде всего организованный КАТАЛОГ, который является индексом для всех файлов, сохраненных в RAMdisc. В КАТАЛОГ проживает в ОЗУ седьмой странице. Это эффективно стек, который начинается по адресу 7EBFF и растет вниз, с каждой записью, принимая двадцать байт. Фигура Два показывает значение этих двадцати байтов, с IX указывающей Первый из этих байтов. В конце стопки каталоге является двадцать байт “Конец каталоге” маркера, только три байта из которых используются. Переменная система (SFNEXT) указывает на этого маркера, и это эффективно стек-указатель для этого каталоге стека.

Пока мы сохраняем каталог в нужном формате, мы можем

манипулировать организацию RAMdisc сам из машинного кода. Это Цель программы этого выпуска.

RAMdisc файлы сами начинают в ОЗУ странице 1, и расти вверх через RAM страницах 3, 4, 6 и 7 (осторожность, чтобы гарантировать, что RAMdisc Файлы не сталкиваются со стеком каталоге). Чтобы избежать каких-либо проблем с этой странной PAGE- нумерации, все адреса в RAMdisc являются “Страница кодировкой”. Это означает, что один регистр проведет страницы-код, в то время как другой регистр-пара проведет реальный физический адрес. Эти коды страница равны 0, 1, 2, 3 и 4 последовательно для RAMdisc файлов, с стр-кода 5 является обычным обозначением для нормальной (48К) оперативной памяти.

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

Рисунок 1

R CHANNEL информационный блок

IX + 00 R_OUT Адрес RAMdisc рутины выходного файла (= B92B) IX + 02 R_IN Адрес RAMdisc входного файла рутину (= B7D4) IX + 04 Дополнительные параметры Здравствуйте Название канала (= “R”) IX + 05 R_IDEN Новый идентификатор канала (= 1234h) IX + 07 R_CLOSE Адрес RAMdisc подать пристальное рутину (= B960) IX + 09 R_LEN Длина информационного канала блока (= 021B) IX + 0B R_CHBYTE Указатель в буфер Число IX + 0D R_CHREC Запись в файл IX + 0Е R_CHNAME Имя файла IX + 18 R_CHFLAG Различные флаги, определяется следующим образом:      Биты 7 до 2: не используется      Бит 1: Установите, если конец-файла в конце записи, сброса в противном случае      Бит 0: Сброс для чтения файла, установить для записи файлов IX + 19 R_RECLEN Длина записи в буфер IX + 1В R_BUFFER буфера хранения текущую запись – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

Рисунок 2

КАТАЛОГ ИНДЕКС ИНФОРМАЦИЯ

IX + 00 SF_NAME Имя файла

IX + 0A SF_START Page кодировкой адрес начала файла IX + 0D SF_LEN Общее количество байтов в файле, в том числе информации заголовка IX + 10 SF_END Page кодировкой адрес байта за конец файла не IX + 13 SF_FLAG Сброс если информация Каталог неполным                   (То есть. Сброс обычно) – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

Канал “R”

Назовем наш новый канал “R”, что означает RAMdisc сериала подать. Это не следует путать с внутренним каналом “R” ПЗУ в, который используется для вставки байты в нормальном (48K) динамического ОЗУ.

Внутренний-channel- “R” является довольно интересным фактически. Это постоянно прилагается поток минус один, так, чтобы использовать его с машинным кодом все, что вам нужно сделать, это выбрать поток минус-один как текущего потока (по загрузка с FF и называя адрес 1601h). Невозможно использовать от BASIC. До выбора поток минус один системной переменной K_CUR должны быть сделаны, чтобы указать где-то в динамической памяти. Печать на поток FF будет затем вставьте символы в динамической памяти в точке обозначается (K_CUR).

Наш новый канал также называется “R”, но его использование гораздо более захватывающим

– И, конечно, он может быть использован с BASIC.

Мы требуем, информационный канал блока над 1 / 2K в размере. Большая часть из этого

на самом деле огромный буфер 0200h байт. Из соображений скорости, буфер используется большую часть времени, с RAMdisc сама только один раз осуществляется доступ конец буфера будет достигнута. Это, конечно, важно понимать, что местоположение файла RAMdisc не является постоянным – оно может двигаться либо, если другой файл удален, или, если более байтов вставляются другой серийный файл RAMdisc. Это означает, что файл должен быть переехал каждый раз мы хотим, чтобы читать или писать в него. Чтобы сэкономить время мы использовать временный буфер практически все время.

Рисунок Один показывает фактическую организацию канала информации

блокировать для нашего правого канала. Обратите внимание, что R_CHREC, R_RECLEN, и укусил одного из R_CHFLAG используются только, если файл представляет собой файл READ. Остальное переменные используются для обоих типов файлов.

Для взаимодействия с BASIC, пример программы машинного кода добавляется

до конца. По существу, серийный файл RAMdisc может быть открыт загрузкой регистра с потоком числа потоке, чтобы быть открыт, в то время как фактическое имя файла хранится в системной переменной N_STR1 по адресу 5B67, а затем вызвав этикетку R_OPEN. Четыре дополнительные точки входа включены, помечены OPEN_4, OPEN_5, CLOSE_4 и CLOSE_5. Вызов OPEN_4 откроет последовательный файл RAMdisc названием “ФАЙЛ1” и прикрепить его на поток четыре. Точно так же, называя OPEN_5 будет открыть последовательный файл RAMdisc под названием “ФАЙЛ2” и прикрепить его на поток пять. Процедуры CLOSE_4 и CLOSE_5, конечно, закрыть эти новые каналы.

Это означает, что новый канал может быть легко использована в BASIC. Возьмите

посмотрите на рисунок три. Он содержит основную программу, которая демонстрирует серийные файлы RAMdisc на работе, в первую очередь, как пишут файлы, а затем прочитанными файлы. Попробуйте – вы можете быть удивлены тем, как быстро он всех работ.

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

Рисунок 3

1000 REM записать файл DEMO

1010 RANDOMIZE USR 47713: REM ОТКРЫТОЕ # 4, “R_FILE1” 1020 RANDOMIZE USR 47720: REM ОТКРЫТОЕ # 5, “R_FILE2” 1030 ЗА = 1 512 1040 INPUT “”: PRINT я 1050 № 4; 2 * я 1060 PRINT # 5; я * I 1070 Далее я 1080 RANDOMIZE USR 47736: REM ЗАКРЫТЬ # 4 1090 RANDOMIZE USR 47740: REM ЗАКРЫТЬ # 5 1100 REM прочитать файл DEMO 1110 RANDOMIZE USR 47713: REM ОТКРЫТОЕ # 4, “R_FILE1” 1120 RANDOMIZE USR 47720: REM ОТКРЫТОЕ # 5, “R_FILE2” 1130 ЗА = 1 512 1140 ВХОД # 4; 1150 ВХОД # 5; б 1160 PRINT, б 1170 Далее я 1180 RANDOMIZE USR 47736: REM ЗАКРЫТЬ # 4 1190 RANDOMIZE USR 47740: REM ЗАКРЫТЬ # 5 1200 СТОП – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

Конечно, вы не всегда хотите, чтобы ваши файлы, чтобы назвать “ФАЙЛ1” или

“ФАЙЛ2 ‘;., И вы не всегда захотите использовать потоки четыре или пять, что Поэтому более общая точка входа R_OPEN включен, который, как есть уже было сказано, требуется что содержит номер потока, и (N_STR1) содержит имя файла (с конечными пробелами, если требуется). Ты придется написать свой собственный машинный код, чтобы исправить любой другой Сочетание в BASIC, используя эту процедуру.

Потенциал для ручьев и каналов безгранична. Здесь

Теоретически возможно, например, чтобы иметь канал, который использует RANDOM доступ к файлам, или по списку файл, в RAMdisc – хотя программы должен был бы быть намного сложнее. Я показал вам достаточно Возможность использования для ручьев и каналов, чтобы подогреть аппетит немного, и там я должен оставить вас. Если спрос достаточно высок, я могу вернуться с более. Хорошо программирования каждый, и может сила будет с вами.

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

Опечатка В OPEN_NEW в адресной B06D (Streams и каналы части второй, январь Выпуск, страница 68) есть инструкция отсутствует. Инструкция POP BC (шестнадцатеричный код С1). Она должна быть одиннадцатым обучение рутина, происходящие между ИЛИ С и JR Z, OPEN_NEW_2. К сожалению об этом.

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

Ниже наводятся процедуры в спектре в ROM 0. Обратите внимание, что есть два альтернативных такие векторные столы, один для Spectrum 128 и один для 128 + 2. Это потому, что обе машины имеют разные диски. Если ПЗУ 128 + 2 изменяется в какой-то неопределенный момент в будущем, то это будет Необходимо переписать эту таблицу далее.

(Только Spectrum 128) B6FC C3AC05 V_ERROR JP # 05AC; Создайте отчет об ошибке B6FF C3641C V_PAGE JP # 1C64; Изменение текущей страницы RAM B702 C3971C V_NEWCAT JP # 1C97; Создать новую запись в каталог B705 C3F31C V_SPACE JP # 1CF3; Обеспечить достаточное пространство в RAMdisc области B708 C3121D V_FIND JP # 1d12; Найти запись каталога для файла B70B C3561D V_CATEND JP # 1D56; прибраться последнюю запись в каталоге

(Spectrum 128 + 2 только) B6FC C3AC05 V_ERROR JP # 05CB; Создайте отчет об ошибке B6FF C3641C V_PAGE JP # 1C83; Изменение текущей страницы RAM B702 C3971C V_NEWCAT JP # 1CB6; Создать новую запись в каталог B705 C3F31C V_SPACE JP # 1d12; Обеспечить достаточное пространство в RAMdisc области B708 C3121D V_FIND JP # 1D31; Найти запись каталога для файла B70B C3561D V_CATEND JP # 1D75; прибраться последнюю запись в каталоге

Остальная часть программы будет таким же, какой бы ни версия Spectrum вы есть. Следующая подпрограмма будет уменьшать на страницу кодировкой адрес состоявшегося в зарегистрируйтесь триплет народные названия.

B70E 2B DEC_BHL декабря HL; Уменьшение HL

B70F 78 LD A, B; A = кодовая страница B710 FE05 CP # 05 B712 C8 RET Z; Возврат при использовании стандартного ОЗУ B713 CB74 BIT 6, H B715 C0 RET NZ; возвращение если HL пересек                                            ; Граница страницы B716 CBF4 SET 6, H; правильный адрес в HL B718 5 декабря B; Уменьшение код страницы B719 C9 RET; возврат

Следующая подпрограмма работает подобно прославленным инструкции LDDR, которые

работает в RAMdisc области, а также в стандартном памяти. Его действие состоит из трех частей: (1) Уменьшение BHL и BHL “; (2) Загрузите один байт с адреса (лимфатических узлов) для решения (BHL ‘); (3) Если BHL не равна CDE затем перейдите к шагу (1).

B71A CD0EB7 RTRANSFER ЗВОНОК DEC_BHL; Уменьшение страницы кодировкой адрес в лимфатических узлов

B71D D9 EXX B71E CD0EB7 ЗВОНОК DEC_BHL; Уменьшение страницы кодировкой адрес в лимфатических узлов » B721 D9 EXX B722 78 LD A, B; A = подкачки код ОТ адрес B723 CDFFB6 ЗВОНОК V_PAGE; Page в ОТ странице памяти B726 7E LD, (HL); = байт для загрузки B727 F5 PUSH AF; Стек этот байт B728 D9 EXX B729 78 LD A, B; A = подкачки код К решению B72A CDFFB6 ЗВОНОК V_PAGE; Page на странице памяти для B72D F1 POP AF; = байт для загрузки B72E 77 LD (HL), A; Нагрузка байт в памяти по мере необходимости B72F D9 EXX B730 78 RTRANSFE2 LD A, B; A = подкачки код ОТ адрес B731 B9 CP C B732 20E6 JR NZ, RTRANSFER; Loop назад, если не равна подкачки                                            ; Код предельного адрес B734 ED52 SBC HL, DE; Установить флаг нуля, если адрес = предел B736 19 ДОБАВИТЬ HL, DE; (ADD HL, DE не влияет флаг нуля) B737 20E1 JR NZ, RTRANSFER; не Loop назад, если предел был                                            ; Достиг B739 C9 RET; возврат

На следующий подпрограмма будет рассчитать страницы кодировкой адрес, который до н.э. байт

дальше от АХЛ. Она предполагает, что до нашей эры всегда меньше 4000h.

B73A 09 ADD_HL_BC ДОБАВИТЬ HL, BC; приращения HL по нашей эры байт

B73B FE05 CP # 05 B73D C8 RET Z; Возврат при использовании стандартного ОЗУ B73E CB74 BIT 6, H B740 C0 RET NZ; возвращение если границы страницы пересек B741 кино сертификации SET 7, H B743 CBF4 SET 6, H; правильный адрес в HL B745 3C INC; Прирост кодовая страница B746 C9 RET; возврат

Эта подпрограмма будет искать файл, имя которого указано в канале

Информация область, в каталоге RAMdisc, давая ошибку, если файл не существует. На выходе IX будет указывать на размещение информации в каталоге.

747 DDE5 find_file PUSH IX B749 E1 POP HL; точки HL для канала информации B74A 010E00 LD BC, # 000E B74D 09 ДОБАВИТЬ HL, BC; HL указывает на имя файла B74E 0E0A LD C, # 0A; BC = длина имени файла (десять) B750 11675B LD DE, N_STR1; DE указывает на системной переменной B753 EDB0 LDIR; Копировать имя файла в системной переменной B755 CD08B7 ЗВОНОК V_FIND; Найти запись каталога для этого имени B758 C0 RET NZ; Возврат, если файл существует, с IX                                            ; Указывая в каталог запись B759 CDFCB6 ЗВОНОК V_ERROR; Генерация сообщения об ошибке B75C 23 DEFB # 23; “ч Файл не существует”

На следующий подпрограмма предназначена для сопоставления буфер для R-канала с

соответствующая область RAMdisc памяти. Подпрограмма будет оставить BHL указывая к первому байту за пределами RAMdisc сегмента, CDE, указывающий на начало Сегмент RAMdisc, и BHL “, указывая на первого байта за соответствующий область в буфере Р-канала. Он также будет сигнализировать ли это или нет после завершения программ файле блока. Это требует, чтобы сначала IX указывает на канале Информационный блок.

B75D DDE5 R_MATCH PUSH IX; Стек канал Информация адрес

B75F DD7E0D LD, (R_CHREC) B762 F5 PUSH AF; Стек номер записи в соответствии B763 CD47B7 ЗВОНОК find_file; IX точки в каталог запись B766 C1 POP BC; B = рекордное количество B767 CB20 SLA B; B = рекордное количество х 2 B769 0E01 LD C, # 01; BC = 200h * рекордное количество + 1 B76B 37 SCF B76C 08 EX AF, AF ‘; Сигнал “Конец блока файла” B76D DD6E0D LD L, (SF_LEN) B770 DD660E LD H, (SF_LEN + 1) B773 DD7E0F LD, (SF_LEN + 2); AHL = длина файла (17 бит) B776 A7 И B777 ED42 SBC HL, BC B779 DE00 SBC, # 00; AHL = длина оставшейся части файла B77B A7 И B77C 2008 JR NZ, RM_NO_EOF; Перейти если высокий частью АХЛ ненулевая B77E 110102 LD DE, # 0201 B781 ED52 SBC HL, DE B783 19 ДОБАВИТЬ HL, DE B784 3804 JR C, RM_EOF; Перейти если АХЛ менее 0201h B786 210002 RM_NO_EOF LD HL, # 0200; HL = длина записи (0200h макс) B789 08 EX AF, AF ‘; Сигнал “Не конец блока файла” B78A EB RM_EOF EX DE, HL; DE = длина записи B78B DD6E0A LD L, (SF_START) B78E DD660B LD H, (SF_START + 1) B791 DD7E0C LD, (SF_START + 2); AHL = закодированы эл от начала файла B794 CD3AB7 ЗВОНОК ADD_HL_BC; AHL = закодированы адр сегмента RAMdisc B797 C5 PUSH BC; Стек 200h * рекордное количество + 1 B798 D5 PUSH DE; длина Стек записи B799 E5 PUSH HL B79A F5 PUSH AF; Стек страница кодировкой адрес сегмента B79B 42 LD B, D B79C 4B LD C, E; BC = длина записи B79D CD3AB7 ЗВОНОК ADD_HL_BC; AHL = стр кодировкой адрес байта                                            ; Следующий сегмент RAMdisc B7A0 47 LD B, A; BHL = этот адрес B7A1 F1 POP AF B7A2 4F LD C, B7A3 D1 POP DE; CDE = стр кодировкой адрес сегмента B7A4 D9 EXX; Использовать альтернативные регистры B7A5 D1 POP DE; DE ‘= длина записи B7A6 C1 POP BC; BC ‘= 200h * рекордное количество + 1 B7A7 DDE1 POP IX; IX указывает на канал инфо область B7A9 DD7319 LD (R_RECLEN), E B7AC DD721A LD (R_RECLEN + 1), D; длина Магазин записи B7AF DDE5 PUSH IX B7B1 E1 POP HL; точки HL ‘для канала информации B7B2 011B00 LD BC, # 001B B7B5 09 ДОБАВИТЬ HL, BC; HL ‘указывает на буфер R-канала B7B6 19 ДОБАВИТЬ HL, DE; точки HL ‘для байта, следующего                                            ; Текущая запись B7B7 0605 LD B, # 05; B = 05, что свидетельствует “Стандарт памяти” B7B9 D9 EXX; Обычные регистры B7BA DDCB188E RES 1, (R_CHFLAG); Сигнал “Не конец блока файла” B7BE 08 EX AF, AF ‘ B7BF D0 RET NC; Возврат разве конце блока файла B7C0 DDCB18CE SET 1, (R_CHFLAG); Сигнал “Конец блока файла” B7C4 C9 RET; возврат

Эта подпрограмма фактически назначает буфер R-канала в рамках подготовки к использованию

с канала чтения. Обратите внимание, что это вызывает подпрограмму RTRANSFER от лейбла RTRANSFE2 для того, чтобы заниматься делом нулевой, когда буфер должен быть считается пустым.

B7C5 CD5DB7 R_ASSIGN ЗВОНОК R_MATCH; Матч буфер с сегмента RAMdisc B7C8 CD30B7 ЗВОНОК RTRANSFE2; Копировать байты в буфер B7CB DD360B00 RBUFFEXIT LD (R_CHBYTE), # 00 B7CF DD360C00 LD (R_CHBYTE + 1), # 00; Сброс указатель в буфер B7D3 C9 RET; возврат

Там теперь следует рутину вход для канала R. Это изолирует вход от

INKEY $ и сделок с каждым соответствующим образом.

B7D4 2A3D5C R_INPUT LD HL, (ERR_SP); HL указывает на ошибки обратный адрес

B7D7 5E LD E, (HL) B7D8 23 INC HL B7D9 56 LD D, (HL); DE = возврат ошибка адрес B7DA 217F10 LD HL, ED_ERROR B7DD A7 И B7DE ED52 SBC HL, DE B7E0 2021 JR NZ, R_INKEY; Перейти если дело с INKEY $ B7E2 ED7B3D5C LD SP, (ERR_SP); Очистить машина стек по мере                                            ; Вернуться из рутины РЕДАКЦИЮ B7E6 E1 POP HL B7E7 E1 POP HL B7E8 223D5C LD (ERR_SP), HL; восстановление нормальной ошибка обратный адрес B7EB CD03B8 R_INPLOOP ЗВОНОК R_INKEY; вход один символ в B7EE FE0D CP # 0D B7F0 C8 RET Z; Возврат, если персонаж “введите” B7F1 FDCB377E BIT 7, (FLAG_X) B7F5 2007 JR NZ, R_INPUT_2; Перейти если делать Линейный вход B7F7 FE22 CP # 22 B7F9 2003 JR NZ, R_INPUT_2; Перейти если характер является “цитаты” B7FB CD850F ЗВОНОК ADD_CHAR_1; Регистрация цитирует дважды B7FE CD850F R_INPUT_2 ЗВОНОК ADD_CHAR_1; Вставить символ во входной зоне B801 18E8 JR R_INPLOOP; Loop обратно ввода остальных строки

Ниже обычных входов один символ из R-канала и возвращается

это в регистр.

B803 CD005B R_INKEY ЗВОНОК SWAP; Page в ПЗУ 0 B806 2A5A5B LD HL, (RETADDR) B809 E5 PUSH HL; Стек обратный адрес в ПЗУ 0 B80A D9 EXX B80B C5 PUSH BC B80C D5 PUSH DE B80D E5 PUSH HL; Стек альтернативный набор регистров B80E DD2A515C LD IX, (CURCHL); IX указывает на канал информации B812 DDCB1846 BIT 0, (R_CHFLAG) B816 2804 JR Z, R_INKEY_2; Перейти если это файл READ B818 CDFCB6 R_ERROR ЗВОНОК V_ERROR; Генерация отчетный код B81B 1D DEFB # 1D; “б Неправильный тип файла” B81C DD5E0B R_INKEY_2 LD E, (R_CHBYTE) B81F DD560C LD D, (R_CHBYTE + 1); DE = положение следующего байта читать B822 DDCB184E БИТ 1, (R_CHFLAG) B826 280F JR Z, RINKYREAD; Перейти если это EOF блок B828 DD6E19 LD L, (R_RECLEN) B82B DD661A LD H, (R_RECLEN + 1); HL = длина текущей записи B82E A7 И B82F ED52 SBC HL, DE B831 2004 JR NZ, RINKYREAD; Перейти, если мы не достигли                                            ; Конец (EOF) записи B833 CDFCB6 ЗВОНОК V_ERROR; Создать отчет об ошибке B836 07 DEFB # 07; “8 Конец файла” B837 DDE5 RINKYREAD PUSH IX B839 E1 POP HL; точки HL для канала информации B83A 011B00 LD BC, # 001B B83D 09 ДОБАВИТЬ HL, BC; HL указывает на буфер B83E 19 ДОБАВИТЬ HL, DE; HL указывает на следующий байт до чтения B83F 7E LD, (HL); = байт, INKEY $ должен вернуться B840 F5 PUSH AF B841 13 INC DE; приращение указателя B842 DD730B LD (R_CHBYTE), E B845 DD720C LD (R_CHBYTE + 1), D; магазин увеличивается указатель B848 15 декабря D B849 15 декабря D B84A 2006 JR NZ, RINKYEXIT; Перейти если буфер будет продлен B84C DD340D INC (R_CHREC); Прирост рекордное количество B84F CDC5B7 ЗВОНОК R_ASSIGN; Связать и сбросить буфер B852 F1 RINKYEXIT POP AF; = байт просто читать из буфера B853 37 SCF; Set Carry, так что INKEY $ # работ                                            ; Правильно B854 E1 RINOUEXIT POP HL B855 D1 POP DE B856 C1 POP BC B857 D9 EXX; Восстановить альтернативные регистры B858 E1 R_EXIT POP HL; HL = адрес возврата в диске 0 B859 225A5B LD (RETADDR), HL; Хранить в системной переменной B85C C3005B JP SWAP; Page в ПЗУ 1 и возвращения

На следующий подпрограмма предназначена, чтобы вставить дополнительные байты в уже

существующий файл, сохраненный в RAMdisc. Любые файлы, которые должны быть перемещены, с тем чтобы освободить место для этих дополнительных байтах будут перемещены так и Переиндексирован для размещения. Подпрограмма должна быть введена с AHL, содержащий страницы кодировкой адрес в который вставляется байты, и БК, содержащий количество байтов для вставки.

B85F C5 RMAKEROOM PUSH BC; Стек количество байт для вставки

B860 E5 PUSH HL B861 F5 PUSH AF; Стек страница кодировкой адрес в                                            ; Для вставки B862 AF XOR; = 00, Carry сброс флага B863 67 LD H, B864 6F LD L, A; AHL = ноль B865 ED42 SBC HL, BC B867 9F SBC,; AHL = минус нет. байтов для вставки B868 CD05B7 ЗВОНОК V_SPACE; Обеспечить достаточное пространство для дополнительных байтов B86B F1 POP AF B86C E1 POP HL; AHL = адрес, по которому для вставки B86D C1 POP BC; BC = количество байтов для вставки B86E C5 PUSH BC B86F E5 PUSH HL B870 F5 PUSH AF B871 3E04 LD A, # 04 B873 CDFFB6 ЗВОНОК V_PAGE; Выберите страницу, содержащую каталог B876 DD2A835B LD IX, (SF_NEXT); IX указывает на “Конец кошки” индекс B87A DD6E0A LD L, (SF_START) B87D DD660B LD H, (SF_START + 1) B880 DD7E0C LD, (SF_START + 2); AHL = стр-кодированный адрес первой                                            ; Запасной байт в RAMdisc области B883 F5 PUSH AF B884 E5 PUSH HL; Стек этот адрес B885 CD3AB7 ЗВОНОК ADD_HL_BC; AHL = стр кодировкой адрес первая                                            ; RAMdisc байт, который останется запасной                                            ; После более байтов вставляются B888 47 LD B, A; BHL = этот адрес B889 D9 EXX; BHL ‘= этот адрес B88A E1 POP HL B88B C1 POP BC; лимфатических узлов указывает на первой запасной байт (старый) B88C F1 POP AF B88D D1 POP DE; ADE = адрес, по которому для вставки B88E 4F LD C, A; CDE = адрес, по которому для вставки B88F D5 PUSH DE B890 F5 PUSH AF; Стек этот адрес B891 CD30B7 ЗВОНОК RTRANSFE2; байт Move, которые должны быть перемещены B894 3E04 LD A, # 04 B896 CDFFB6 ЗВОНОК V_PAGE; Выберите страницу, содержащую каталог B899 C1 POP BC B89A D1 POP DE; BDE = позиция вставки B89B DD6E0A R_MR_LOOP LD L, (SF_START); AHL = предыдущая страница кодировкой адрес B89E DD660B LD H, (SF_START + 1); файл RAMdisc (или рядом запасной байт) B8A1 DD7E0C LD, (SF_START + 2); которые, возможно, были перемещены B8A4 B8 CP B B8A5 382E JR C, R_MRFOUND; Перейти если адрес файла предшествует                                            ; Точка вставки B8A7 ED52 SBC HL, DE B8A9 19 ДОБАВИТЬ HL, DE B8AA 3829 JR C, R_MRFOUND; Перейти если адрес файла предшествует                                            ; Точка вставки B8AC EB EX DE, HL B8AD Е3 EX (SP), HL B8AE EB EX DE, HL; DE = количество байт вставляется B8AF 19 ДОБАВИТЬ HL, DE B8B0 3005 JR NC, R_MR_ADDR B8B2 кино сертификации SET 7, H B8B4 CBF4 SET 6, H B8B6 3C INC; AHL = новый адрес файла B8B7 EB R_MR_ADDR EX DE, HL B8B8 Е3 EX (SP), HL B8B9 EB EX DE, HL; BDE = позиция вставки B8BA DD750A LD (SF_START), L B8BD DD740B LD (SF_START + 1), Н B8C0 DD770C LD (SF_START + 2),; магазин новый начальный адрес файла B8C3 C5 PUSH BC B8C4 011400 LD BC, # 0014 B8C7 DD09 ДОБАВИТЬ IX, BC; IX баллов по индексу для следующего файла B8C9 C1 POP BC; BDE = позиция вставки B8CA DD7510 LD (SF_END), L B8CD DD7411 LD (SF_END + 1), Н B8D0 DD7712 LD (SF_END + 2),; магазин новый адрес для следующего файла B8D3 18C6 JR R_MR_LOOP; Loop назад дело с этим файлом B8D5 DD6E0D R_MRFOUND LD L, (SF_LEN) B8D8 DD660E LD H, (SF_LEN + 1) B8DB DD7E0F LD, (SF_LEN + 2); AHL = предыдущая длина файла B8DE EB EX DE, HL B8DF Е3 EX (SP), HL B8E0 EB EX DE, HL; DE = количество байт вставляется B8E1 19 ДОБАВИТЬ HL, DE B8E2 CE00 АЦП, # 00; AHL = новая длина файла B8E4 DD750D LD (SF_LEN), L B8E7 DD740E LD (SF_LEN + 1), Н B8EA DD770F LD (SF_LEN + 2),; магазин новый длина файла B8ED 78 LD A, B; A = стр-код точки вставки B8EE 42 LD B, D B8EF 4B LD C, E; BC = количество байт вставляется B8F0 E1 POP HL; AHL = стр кодировкой адрес точки                                            ; С которой байты были вставлены B8F1 C9 RET; возврат

Следующая подпрограмма будет передавать содержимое буфера R-канала

в соответствующем файле RAMdisc.

B8F2 DD4E0B R_STORE LD C, (R_CHBYTE)

B8F5 DD460C LD B, (R_CHBYTE + 1); BC = количество байтов в буфере B8F8 DDE5 PUSH IX; Стек адрес R-канал информации B8FA C5 PUSH BC; Стек количество байтов в буфере B8FB CD47B7 ЗВОНОК find_file; IX точки в файл запись в кошки.

B8FE C1 POP BC; BC = количество байтов в буфере B8FF DD6E10 LD L, (SF_END) B902 DD6611 LD H, (SF_END + 1) B905 DD7E12 LD, (SF_END + 2); AHL = стр-кодированный адрес первой                                            ; Байт за конец файла B908 CD5FB8 ЗВОНОК RMAKEROOM; Вставить достаточно места для содержания                                            ; Из буфера B90B DDE1 POP IX; IX указывает на канале информации B90D CD3AB7 ЗВОНОК ADD_HL_BC; AHL указывает на один байт за пределами                                            ; Последняя из новых байт B910 C5 PUSH BC; Стек количество байтов в буфере B911 47 LD B, A; BHL = адрес последнего нового байта + 1 B912 D9 EXX; BHL ‘= адрес последнего нового байта + 1 B913 DDE5 PUSH IX B915 E1 POP HL; HL = адрес информации о канале B916 011B00 LD BC, # 001B B919 09 ДОБАВИТЬ HL, BC; HL указывает на начало буфера B91A C1 POP BC; BC = количество байтов в буфере B91B E5 PUSH HL; Стек адрес начала буфера B91C 09 ДОБАВИТЬ HL, BC; HL указывает на байт за буфером B91D D1 POP DE; DE указывает на начало буфера B91E 010505 LD BC, # 0505; BHL и CDE теперь страница кодировкой адреса B921 CD30B7 ЗВОНОК RTRANSFE2; Копировать буфер в RAMdisc области B924 78 LD A, B; A = 05 B925 CDFFB6 ЗВОНОК V_PAGE; Page в нормальном ОЗУ B928 C3CBB7 JP RBUFFEXIT; Сброс указателя в буфере и возвращения

Сейчас идет выходной рутину, чья работа заключается, чтобы напечатать символ хранится в

зарегистрируйтесь на R канала (т.е.., чтобы сохранить его, во-первых, в буфере, и в конечном счете, в файле RAMdisc).

B92B CD005B R_PRINT ЗВОНОК SWAP; Page в ПЗУ 0 B92E 2A5A5B LD HL, (RETADDR) B931 E5 PUSH HL; Стек адрес возврата в диске 0 B932 D9 EXX B933 C5 PUSH BC B934 D5 PUSH DE B935 E5 PUSH HL; Стек альтернативный набор регистров B936 DD2A515C LD IX, (CURCHL); IX указывает на канале информации

                                           

                                           

                                           

                                           

должен быть открыт.

                                           

                                           

                                           

                                           

                                           

                                           

JimG]

                                           

                                           

                                           

                                           

                                           

                                           

технические условия.

     

           

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

Краткая информация о Streams and Channels

Для игры в Streams and Channels не нужны эмуляторы. Эта приложение для программирования, опубликованное в Великобритании в 1986 году творческой группой ZX Computing, которое написал Toni Baker.

Не запускается или глючит игра, или не можете пройти? Спросите в комментариях.

Subscribe
Уведомлять об
guest
0 комментариев
Inline Feedbacks
View all comments

Сохранённые игры[X]

  

Справка[X]

Помощь уже в пути!

  • x1
  • x2
  • x3

Кликни в окно эмулятора, чтобы управлять!
<<<<

Не забывайте периодически сохранять игровой прогресс на сервере (клавишей F8), чтобы уверенно продвигаться вперёд!

Если вы гость на сайте, то прогресс будет сохранён только в памяти браузера и потеряется при закрытии. Чтобы этого не произошло - просто войдите в свой профиль.

Для загрузки сохранённой игры жмите F3 или откройте меню "Диск" кнопкой на правой панели.

Если игра не запускается, или у вас есть вопросы по игре - задайте их ниже.

Поделиться
Close
0
Would love your thoughts, please comment.x