ZX Spectrum
Game

WordSheep

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

Автор:

Жанр: Текстовые редакторы


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

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

Язык

  • Русский
  • English

Управление

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

Игроков

  • Один
  • Описание (авт.пер.)
  • Информация

1 2 3 4 5 6 7 8

Освоение машинного кода на Вашем Spectrum часть 8 из 8 – от ZX Computing февраля / Mar’84

К сожалению, мы достигли последнюю часть Тони Бейкер превосходно

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

Это будет последним в серии статей, несущих

это название. Это не значит, что я не пишу для Журнал больше – просто, что в следующий раз я буду начиная от чего-то другого. Однако, так как это в прошлом MMC немного, я думал, что выйти с треском. Я бы хотел Список для вас то, что можно самой сложной машины Код программы-либо напечатаны в любой вычислительной журнала.

Это программа текстового процессора: Я называю это “WordSheep” в заказать, чтобы остановить вещи становиться слишком серьезно. Позволь мне описать вам, что она делает в первую очередь, начиная с ограничения.

Во-первых, вы можете работать только с одним экране результатов текста на

Время. Это означает, что если вы хотите, чтобы ввести длинную письмо Вы должны относиться к нему в виде отдельных частей, хотя отмечают, что это не будет на самом деле имеет значение, потому что с помощью принтера ZX есть не будет “присоединиться” между целому экрану. Вы не можете сделать умные вещи, как копирование целые абзацы всему разместить или перетасовки блоков текста вокруг. Вот то, что вы МОЖЕТЕ сделать:

Буквенных клавиш производить буквы алфавита – либо

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

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

РЕД (CAPS SHIFT 1) Принесите на одну строку вниз для редактирования

CAPS LOCK (CAPS SHIFT 2) Изменение с L режиме на C режиме и наоборот Чистая линия (колпачки переложить 3) Удаление одной строки текста Очистить экран (колпачки переложить 4) Бланк весь экран CURSOR LEFT (CAPS SHIFT 5) Перемещение курсора влево Курсор вниз (колпачки переложить 6) Переместить курсор вниз Курсор вверх (CAPS SHIFT 7) Перемещение курсора вверх Курсор вправо (CAPS SHIFT 8) Перемещение курсора вправо КОПИЯ (CAPS SHIFT 9) Скопируйте экран на принтер ZX УДАЛЕНИЕ (колпачки переложить 0) Удалить один символ в позиции курсора ENTER (ввод) Конец пункта РЕФОРМА (символ сдвига Q) Реконструировать пункт после изменений                                   были сделаны EXIT (символ сдвиг W) Вернуться к BASIC Изображение (оба сдвиги) User Defined Function Control

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

Символ сдвиг в этой программе работает немного отличается от того, что Вы привыкли к. Различия заключаются в следующем:

Символ переключения Q и Symbol Сдвиг W являются, как указано выше. Символ Сдвиг E производит символ авторского права “(с)” (символ 7F). Символ Сдвиг я производит нечто, называемое SOLID пространстве. Это выглядит как                 пространство для меня и вас, но не рассматривается как один по                 компьютер. Это на самом деле графика символу, код является                 80. Он может быть использован, когда требуется специфический интервал.

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

Все остальные клавиши с символом Сдвиг будет производить ASCII характер, который напечатан в читать на или ниже, что Ключ. Это означает, что вам не нужно, чтобы войти в режим ‘E’ в Чтобы получить фигурные скобки – просто нажмите Symbol Shift, F и G. (Обратите внимание, что режим «Е» не используется вообще в этом Программа, и что никакие ключевые слова или жетоны не может быть получен.)

[Были около 20 ошибок печати в журнале работы этого. JG.]

ОК – вот программа. Для того чтобы минимизировать ошибки я

для изменения включают абсолютные адреса, которые я использовал. Вы можете изменить это, конечно, – например вычитания 8000 из всех моих адресов позволит программе работать на 16K Spectrum. Единственное ограничение на изменение моих адресов является то, что второй и третий таблицы в начале Программа должна использовать тот же высокой части адреса всю дорогу через – в моем случае “EA”. Перед тем, как начать печатать в листинг сведению, что программа использует ‘Graphic A’, который является определяется таким образом:

00 GRAPHIC_A DEFB 00000000b 00 DEFB 00000000b FF DEFB 11111111b 00 DEFB 00000000b 00 DEFB 00000000b FF DEFB 11111111b 00 DEFB 00000000b 00 DEFB 00000000b

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

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

                     ORG E800

         U_TABLE DEFS 0280 Занимает адреса E800 для EA7F          L_TABLE DEFS 60 Занимает адреса EA80 с EADF          S_TABLE DEFS 20 Занимает адреса EAE0 к EAFF

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

Первая подпрограмма используется для удаления всех ненужных пробелов в линия редактируется. Эта линия находится в L_TABLE (Lower Экран Таблица).

                     ORG EB00

  • 21E0EA КОМПРЕСС LD HL, # EAE0 HL указывает на один байт за пределами L_TABLE 3E20 LD, “пространство” 065F LD B, # 5F B: = количество символов поз для проверки 2В C_1 декабря HL HL указывает на следующий байт в L_TABLE BE CP (HL) Есть ли пространство в этом месте?
  • 2003 JR NZ, C_2 Перейти если нашли не пробел 10FA DJNZ C_1 Повторите для целого файла (Примечание ее не является                                          Необходимо проверить очень первый символ) C9 RET Выход, если файл полон пространств                                          (За исключением, возможно, для первого байта) 2E80 C_2 LD L, # 80 HL указывает на первый байт L_TABLE 0E01 LD C, # 01 С “пространство для удаления” флаг BE C_3 CP (HL) Есть ли пространство в этом месте?
  • 2015 JR NZ, C_5 Перейти если не 0D декабря C Test ‘пространство для удаления “флаг 200E JR NZ, C_4 Перейти если пространство не будет удалена C5 PUSH BC 04 INC BB: = количество байтов для перемещения E5 PUSH HL 54 LD D, H 5D LD E, L DE: = адрес места должны быть удалены 23 INC HL HL: = адрес следующего байта 48 LD C, B 0600 LD B, # 00 BC: = количество байтов для перемещения EDB0 LDIR Delete пространство E1 POP HL 2В декабря точки HL HL сначала восстановлены места С1 POP BC B: = число байтов влево, чтобы проверить 0E01 C_4 LD C, # 01 Set “пространство для удаления” флаг 1802 JR C_6 0E00 C_5 LD C, # 00 Сброс флага (пространство не будет удален) 23 C_6 INC HL точка к следующему символу вдоль 10E3 DJNZ C_3 Повторите столько байт, как надо C9 RET Конец подпрограммы

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

В таблице S_TABLE (пользования Таблица) сохраняет последовательность байтов, каждый из которых является низкая часть адреса “пространство” Характер где-то в L_TABLE. Работа следующем суб- рутина, чтобы вставлять пробелы ‘C’ в L_TABLE по адресу чья нижняя часть хранится по адресу HL (т.е.. вставлять пробелы ‘C’ по адресу H * 100h + (HL)).

                     ORG EB30

F5 INS_SPACE PUSH AF C5 PUSH BC D5 PUSH DE E5 PUSH HL 6E LD L, (HL) HL: = адрес существующего пространства E5 PUSH HL Стек этот адрес 2EDF LD L, # DF HL указывает на последний байт L_TABLE 0600 LD B, # 00 BC: = количество пробелов вставить A7 И ED42 SBC HL, BC HL указывает на последний байт, который будет                                          остаются после введения 54 LD D, H 5D LD E, L DE: = адрес последнего байта, чтобы остаться E1 POP HL HL: = адрес существующего пространства 2В декабря HL EB EX DE, HL C5 PUSH BC E5 PUSH HL A7 И ED52 SBC HL, DE HL: = количество байтов для перемещения 44 LD B, H 4D LD C, L BC: = количество байтов для перемещения E1 POP HL HL: = адрес последнего байта, чтобы остаться 11DFEA LD DE, # EADF DE указывает на последний байт в L_TABLE EDB8 LDDR Move требуется персонажи EB EX DE, HL HL указывает на последний новое положение C1 POP BC BC: = количество байт вставляется 41 LD B, CB: = количество байт вставляется 3620 IS_LOOP LD (HL), “пространство” Переписать следующий байт 2В декабря HL найденные на следующий байт для перезаписи 10FB DJNZ IS_LOOP Повторите для каждой из новых позиций E1 POP HL HL указывает на S_TABLE E5 PUSH HL 23 IS_SPACES INC HL найденные на следующий адрес низким части 7E LD, (HL): = бывший низкой частью адрес места FEA0 CP # A0 Выход, если не в первый байт 20h 3004 JR NC, IS_EXIT 81 ДОБАВИТЬ A, C 77 LD (HL), адресный указатель Обновление 18F6 JR IS_SPACES Повторите для всех адресов E1 IS_EXIT POP HL D1 POP DE C1 POP BC Обратите внимание, что эта подпрограмма листьев                                          все регистры без изменений F1 POP AF C9 RET Конец подпрограммы

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

Запутанная подпрограмма сейчас. Цель этой суб- рутина, чтобы вставлять пробелы в линии редактируется так что один пробел происходит на тридцать третьей позиции. Таким образом полная слово закончится на тридцать второй позиции, обеспечение того, чтобы правые края остаются прямыми.

                     ORG EB68

016000 ADJUST LD BC, # 0060 BC: = количество байтов в L_TABLE 11E0EA LD DE, # EAE0 DE указывает на начало S_TABLE 2180EA LD HL, # EA80 HL указывает на начало L_TABLE 3E20 A_SEARCH LD, “пространство” EDB1 CPIR Поиск следующего места 2007 JR NZ, A_ST_DONE Перейти если пробелы не осталось найти 7D LD A, L 3D декабря AA: = низкий часть адреса места 12 LD (DE), магазин в S_TABLE 1С INC E DE указывает на следующий байт в таблице 20F4 JR NZ, A_SEARCH Если комната в таблице повторить на следующий пространстве 1D декабря E DE: = EAFF (последний байт S_TABLE) EB A_ST_DONE EX DE, HL HL указывает на последний используемый байт в S_TABLE 36FF LD (HL), # FF магазин конец таблицы маркера 2EE0 LD L, # E0 HL указывает на первый байт S_TABLE 7E LD, (HL): = низкий частью адрес первого места FE9F CP # 9F D0 RET NC Возврат если нет пространства внутри                                          первые 31 байт, начиная с регулировкой                                          было бы невозможно 47 A_SP_END LD B, AB: = низкий часть адреса прошлого пространстве 23 INC HL Перемещение к следующему элементу таблицы 7E LD, (HL): = низкий часть адреса следующего места FEFF CP #FF Проверка по окончании файла маркера 280D JR Z, A_CH_2 Перейти если конец файла достигнут 4F LD C, временно хранить в C 90 SUB BA: = расстояние между двух последних пространств 3D декабря указан флаг нуля, если есть два места                                          подряд. (Это будет только в случае                                          если конец текста была достигнута.) 79 LD A, C восстановить 2805 JR Z, A_CH_1 Перейти если конец текста достиг FEA0 CP # A0 Есть ли пространство на 33-й позиции?

C8 RET Z Возврат если так, поскольку без регулировки                                          необходим 18EE JR A_SP_END В противном случае проверьте следующее пространство 36FF A_CH_1 LD (HL), # FF Отметить как конец файла 2EE1 A_CH_2 LD L, # E1 HL указывает на второе элемента S_TABLE 3EA0 LD A, # A0 BE CP (HL) C8 RET Z Возврат, если есть только одно место в                                          первые 32 байт, начиная с регулировкой                                          было бы невозможно D8 RET C 1E00 LD E, # 00 4E A_NUMBER LD C, (HL) C: = низкий частью адрес последнего места 1С INC EE рассчитывает количество пробелов 23 INC HL найденные в следующем пространстве BE CP (HL) 30FA JR NC, A_NUMBER Повторите для всех пространств внутри сначала                                          Байт 20ч 91 SUB CA: = общее количество мест, чтобы вставить 0EFF LD C, # FF 0C A_MOD INC CC рассчитывает INT (число пробелов                                          требуется / количество существующих пространств                                          в диапазоне) 93 SUB EA записи Остальная часть этого подразделения 30FC JR NC, A_MOD Обратите внимание, что регулируется еще раз                                          чем нужно 83 ADD A, E Восстановление истинного остатка 57 LD D, AD: = остаток от деления 0C INC C 0D декабря C 2809 JR Z, A_REMAIN Перейти если разделение равна нулю 43 LD B, EB: = количество существующих пробелов в диапазоне 2EE0 LD L, # E0 HL указывает на первый элемент S_TABLE ‘C’ пространства CD30EB A_SL_1 CALL INS_SPACE вставить 23 INC HL Перемещение к следующему элементу S_TABLE ‘E * C’ пространства 10FA DJNZ A_SL_1 уже вставлена                                          равномерно 14 A_REMAIN INC D 15 A_SL_2 декабря D Полное С8 RET Z Задача – выход подпрограмма D5 PUSH DE 2A765C LD HL, (SEED) HL: = случайное число семян 54 LD D, H 5D LD E, L

29 ДОБАВИТЬ HL, HL умножить на 2 …
29 ДОБАВИТЬ HL, HL 4 …
19 ДОБАВИТЬ HL, DE 5 …
29 ДОБАВИТЬ HL, HL
29 ДОБАВИТЬ HL, HL 14 …
29 ДОБАВИТЬ HL, HL 28 …
19 ДОБАВИТЬ HL, DE 29 …

22765C LD (SEED), HL-магазин новое случайное число семян D1 POP DE Восстановление D и Е 7С LD, HA: = случайное число 93 A_RANDOM SUB E 30FD JR NC, A_RANDOM 83 ДОБАВИТЬ, EA: = случайное число между 0 и “E-1” C6E0 ДОБАВИТЬ, # E0 6F LD L, 26EA LD H, # EA HL указывает на случайный элемент S_TABLE 0E01 LD C, # 01 C: = количество пробелов вставить CD30EB ЗВОНОК INS_SPACE Вставить пространство 18DC JR A_SL_2 правильное количество пробелов есть сейчас                                          вставлена, распределены более или                                          менее равномерно

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

В противоположность этому, в ближайшие несколько подпрограмм все действительно легко следовать. Работа этого является копировать текст из L_TABLE к нижняя часть экрана. Обратите внимание, что переменная система (DF_SZ) считается 04, не 02.

                     ORG EBE5

21A050 TRANSFER_L LD HL, # 50A0 HL: = позиция печати на экране 22865C LD (DFCCL), HL-магазин позиция печати 212117 LD HL, # 1721 HL: = экран координаты 228A5C LD (SPOSNL), координаты HL-магазин FD360201 LD (TVFLAG), # 01 Прямая печать на нижнюю часть экрана 2180EA LD HL, # EA80 HL указывает на начало L_TABLE 0640 LD B, # 40 В: = количество байтов в печати 7E TL_PRINT LD, (HL): = следующий символ для печати 23 INC HL найденные на следующий символ в печати D7 RST # 10 Распечатать характер 10FB DJNZ TL_PRINT Повторите для 40H символов 3AB15C LD, (L_CURSOR): = низкий часть адреса курсора                                          в L_TABLE C620 ДОБАВИТЬ, # 20 А: = низкий часть адреса курсора                                          в атрибуты файла 6F LD L, 265A LD H, # 5A HL: = адрес курсора в                                          атрибуты файла 7E LD, (HL): = атрибут по этому адресу EE3F XOR # 3F дополнять цвета 77 LD (HL), новый атрибут магазин, чтобы указать,                                          курсор C9 RET

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

Обратите внимание на то, что выше подпрограмма использует программы Переменная называется L_CURSOR который один байт и живет в 5CB1. Это сохраняет низкую часть адреса от курсора в редактирования строки (в L_TABLE). Существует еще одна переменная используется в программе, и это называется U_CURSOR (верхний курсор) который имеет длину два байта, и сохраняет адрес второй Курсор – на этот раз в U_TABLE; это всегда левая кромка экрана. Его адрес 5CAF, и это сделано использование этого следующего подпрограммы, которая называется TRANSFER_U. Цель этой подпрограммы очень похож на последний один – он копирует текст из U_TABLE в верхней части Экран.

                     ORG EC0C

210040 TRANSFER_U LD HL, # 4000 HL: = позиция печати на экране 22845C LD (DF_CC), HL-магазин позиция печати 212118 LD HL, # 1821 HL: = на экране координаты 22885C LD (S_POSN), координаты HL-магазин FD360200 LD (TVFLAG), # 00 Прямая печать на верхней части экрана 2100E8 LD HL, # E800 HL указывает на первый байт U_TABLE 010380 LD BC, # 8003 B: = 80 и C: = 03 7E TU_PRINT LD, (HL): = следующий символ для печати 23 INC HL найденные на следующий символ в печати D7 RST # 10 Распечатать характер 10FB DJNZ TU_PRINT Повторите для любой 80 или 100                                          персонажи. B: = 00 (эффективно 100) 0D декабря C 20F8 JR NZ, TU_PRINT Всего 0280 байт все 2AAF5C LD HL, (U_CURSOR) HL указывает на позицию курсора                                          в U_TABLE 7С LD, HA: = высокий участие D690 SUB # 90 67 LD H, A HL указывает на позицию курсора                                          в атрибуты файла 3A8D5C LD, (ATTR_P) A: = атрибут обычно используется                                          для экрана EE3F XOR # 3F дополнять цвета          WIPE_LINE $ См ниже

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

Эта подпрограмма ведет прямо в рутину под названием WIPE_LINE который будет использоваться довольно много других частях программа. Это тычет байт удерживаться в рамках регистра в 20ч последовательных местах. В приведенном выше случае он используется для дополнять цвета из одного ряда в верхней части Экран в позиции курсора. Он также может быть вызван из Этикетка WIPE, и в этом случае количество локаций, которые будут ткнул является BC + 1.

                     ORG EC36

011F00 WIPE_LINE LD BC, # 001F BC: = число мест, чтобы ткнуть,                                          менее одного 54 WIPE LD D, H 5D LD E, L DE: = адрес 1-го места 13 INC DE DE: = адрес 2-го места 77 LD (HL), Пок первое местоположение EDB0 LDIR Poke Остальные места C9 RET

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

На следующий подпрограмма CLEAR_SCREEN подпрограмма, которая является Доступ после запуска с CAPS SHIFT 4. Вы должны быть в состоянии следовать его без объяснения причин от меня.

                     ORG EC40

2100E8 CLEAR_SCRN LD HL, # E800 HL указывает на первый байт U_TABLE 22AF5C LD (U_CURSOR), HL Сброс верхний курсор к верхней линии 3E80 LD A, # 80: = низкий часть адреса первым                                          байт L_TABLE 32B15C LD (L_CURSOR), Reset нижний курсор в начало строки 01DF02 LD BC, # 02DF BC: = количество байтов в U_TABLE и                                          L_TABLE сочетании, менее одного 3E20 LD, “пространство” CD39EC ЗВОНОК WIPE Заполните обе таблицы с пробелами CD0CEC ЗВОНОК TRANSFER_U Blank верхняя часть экрана C3E5EB JP TRANSFER_L Blank нижняя часть экрана

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

Теперь вещи начинают получать очень легко. Это CURSOR ЛЕВЫЙ рутина.

                     ORG EC59

3AB15C ЛЕВЫЙ LD, (L_CURSOR): = адрес курсора (нижней части) FE80 CP # 80 курсор уже на левом линии?

C8 RET Z Возврат если так FD3577 DEC (L_CURSOR) В противном случае перемещения курсора влево C9 RET и возврат

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

И с удивительной схожести, курсор вправо.

                     ORG EC63

3AB15C ПРАВО LD, (L_CURSOR): = адрес курсора (нижней части) FEBF CP #BF ли курсор уже на правом линии?

C8 RET Z Возврат если так FD3477 INC (L_CURSOR) В противном случае перейти курсор вправо C9 RET и возврат

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

Это рутина курсора вверх.

                     ORG EC6D

2AAF5C UP LD HL, (U_CURSOR) HL: = адрес курсора 1100E8 LD DE, # E800 DE: = высокая позиция допустимая A7 И ED52 SBC HL, DE ли курсор уже на вершине?

C8 RET Z Возврат если так 11E0FF LD DE, # FFE0 DE: = вертикальное перемещение вверх                                          одна линия 180D JR DOWN_UP Перемещение курсора вверх

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

И, как и следовало ожидать, курсор вниз рутина.

                     ORG EC7C

2AAF5C DOWN LD HL, (U_CURSOR) HL: = адрес курсора 1160EA LD DE, # EA60 DE: = низкое положение допустимая A7 И ED52 SBC HL, DE ли курсор уже на дне?

C8 RET Z Возврат если так 112000 LD DE, # 0020 DE: = вертикальное смещение вниз                                          одна линия 2AAF5C DOWN_UP LD HL, (U_CURSOR) HL: = адрес курсора 19 ДОБАВИТЬ HL, DE Вычислить новое положение 22AF5C LD (U_CURSOR), HL-магазин новая должность C30CEC JP TRANSFER_U печати экран, показывающий курсор в новое                                          положение

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

Теперь мы подошли к функции редактирования. Это тоже довольно прямой вперед.

                     ORG EC93

2AAF5C EDIT LD HL, (U_CURSOR) HL: = адрес верхней курсора 1180EA LD DE, # EA80 DE: = адрес 1-го байта в L_TABLE FD7377 LD (L_CURSOR), E Переместить нижний курсор слева от строки 012000 LD BC, # 0020 BC: = число байт в одной линии 79 LD, CA: = “пространство” EDB0 LDIR Копировать линия в L_TABLE 0E3F LD C, # 3F BC: = количество байт, чтобы стереть,                                          менее одного EB EX DE, HL HL: = адрес первого байта стереть 1892 JR WIPE Стереть остаток L_TABLE

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

Теперь мы подошли к CAPS LOCK функцию. Это зависит от Дело в том, что режим Режим L / C хранится в ПЗУ, как бит три из переменной FLAGS2 системы. Это сброса для L режиме, или установить для режима C.

                     ORG ECA7

3A6A5C CAPS_LOCK LD, (FLAGS_2) Fetch FLAGS_2 EE08 XOR # 08 Дополнение бит 3 326A5C LD (FLAGS_2), переменная магазин поправками C9 RET

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

Легче и проще, а? На следующий подпрограмма КОПИЯ Функция, которая используется программой для копирования верхней девяти- подростковые линии экрана на принтер ZX.

                     ORG ECB0

F3 COPY_13 DI Это потому, что копия не будет работать, если                                          что прерывания разрешены 0698 LD B, # 98 В: = количество строк для копирования                                          (Примечание: восемь строк равна одной строки) C3AF0E JP COPY_B Перейти в ROM процесс копирования                                          (Примечание: эта процедура автоматически                                          повторно разрешает прерывания)

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

Сейчас идет процедура CLEAR_LINE, цель которого заключается в стереть (т.е.. перезаписи с пространством) одну строку текста из Верхняя часть экрана в позицию курсора.

                     ORG ECB6

2AAF5C CLEAR_LINE LD HL, (U_CURSOR) HL указывает на верхней позиции курсора 3E20 LD, “пространство” CD36EC ЗВОНОК WIPE_LINE Стереть линии по мере необходимости C30CEC JP TRANSFER_U Повторная печать верхний экран с линии                                          стертый

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

Именно в этот момент, что вещи начинают получать немного больше запутанная. Это DELETE рутина.

                     ORG ECC1

CD59EC Удалить вызов ЛЕВАЯ Перемещение курсора влево, если это возможно C8 RET Z Возврат если курсор слева от строки 6F LD L, 26EA LD H, # EA HL: = предыдущая адрес курсора 5F LD E, 1D декабря E 54 LD D, H DE: = новый адрес курсора 2F CPL D61F SUB # 1F: = количество байтов для перемещения 4F LD C, 0600 LD B, # 00 BC: = количество байтов для перемещения не EDB0 LDIR Байт не удаляются [так в оригинале. JG.] 3E20 LD, “пространство” 12 LD (DE), Erase окончательный характер в L_TABLE

                     ORG ECD6

C9 RET [Undefined в журнале. JG.]

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

Далее идет захватывающая часть! Это рутина ХАРАКТЕР, который контролирует то, что происходит, когда любой символ в диапазоне От 20 до 80 приводится. Характер в вопросе начинает свою жизнь (Насколько это подпрограмма обеспокоен) в регистр.

                     ORG ECD7

F5 ХАРАКТЕР PUSH AF Стек характер, чтобы добавить 3AB15C LD, (L_CURSOR): = положение курсора 21E1EA LD HL, # EAE1 HL указывает на второй байт S_TABLE 36FF LD (HL), # FF магазин концом маркера файла 2В декабря HL HL указывает на первую байта S_TABLE 77 LD (HL), магазин положение курсора 0E01 LD C, # 01 C: = количество байтов для вставки CD30EB ЗВОНОК INS_SPACE Вставьте один пробел в нужное место FD6E77 LD L, (L_CURSOR) HL: = адрес курсора F1 POP AF: = персонаж добавить в файл 77 LD (HL), магазин персонаж в правильной точке CD63EC Звоните прямо Перемещение курсора право на следующий символ 2806 JR Z, ПРОЦЕСС Перейти вперед, если в правой части строки 3ABFEA LD, (# EABF): = 32-й символ в файле FE20 CP “пространство” C8 RET Z Если это пространство, то процедура                                          законченный          ПРОЦЕСС $ противном случае …

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

Ты готов? Это основная процедура обработки. Это может Также можно назвать с метками PROCESS_1 и PROCESS_2.

Пожалуйста, обратите особое внимание на то, что происходит здесь.

                     ORG ECF7

CD00EB процесса вызова КОМПРЕСС Удалите все ненужные пробелы CD68EB PROCESS_1 ЗВОНОК ADJUST линии до правого поля 2180EA PROCESS_2 LD HL, # EA80 HL указывает на первый байт L_TABLE ED5BAF5C LD DE, (U_CURSOR) DE: = адрес верхней курсора 012000 LD BC, # 0020 BC: = количество символов в одной строке EDB0 LDIR Передача одной линии с верхней экране E5 PUSH HL Стек постоянная EAA0 CD7CEC ЗВОНОК DOWN Перемещение верхний курсор вниз, если это возможно E1 POP HL HL указывает на первую байт 2-й линии 1180EA LD DE, # EA80 DE указывает на первого байта 1-й линии 014000 LD BC, # 0040 BC: = количество байтов для перемещения EDB0 LDIR Удалить верхнюю строку из L_TABLE 3E20 LD, “пространство” EB EX DE, HL HL указывает на третью линию L_TABLE CD36EC ЗВОНОК WIPE_LINE Erase последняя строка 21C0EA LD HL, # EAC0 HL указывает на начало 3-й линии                                          из L_TABLE 0640 LD B, # 40 В: = количество байтов в первую двумя линиями 2В PR_LOOP декабря HL найденные на следующий байт вместе BE CP (HL) Является ли это пространство?

2003 JR NZ, PR_CURSOR Перейти вперед, если не 10FA DJNZ PR_LOOP Попробуйте еще раз для следующего байта 2В декабря HL HL: = EA7F 23 PR_CURSOR INC HL HL: = новый адрес курсора 7D LD, LA: = низкий часть этого адреса 32B15C LD (L_CURSOR), магазин новое положение курсора C9 RET

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

Далее у нас есть новый порядок пункте – это то, что происходит когда вы нажмете клавишу ENTER. Смотрите, если вы можете следовать ему.

                     ORG ED2E

CD00EB ENTER ЗВОНИТЕ КОМПРЕСС Удалите ненужные пробелы 21C0EA LD HL, # EAC0 Точка HL вне всякого текста в L_TABLE 3E20 LD, “пространство” 2В E_CHECK декабря HL найденные на следующий символ BE CP (HL) Является ли это пространство?

28FC JR Z, E_CHECK Loop обратно, если так 7D LD, LA: = низкий часть адреса в прошлом                                          не пробел в файле FEA0 CP # A0 ли на первой линии?

D4FAEC ЗВОНОК NC, PROCESS_1 Если не обработать одну строку из                                          Нижняя часть с верхней части экрана CD00EB ЗВОНОК КОМПРЕСС Теперь удалите все лишние пробелы, генерируемые                                          по приведенной выше инструкции CDFDEC ЗВОНОК PROCESS_2 Копировать Заключительная часть L_TABLE на экран,                                          но без выравнивая правого поля CDB6EC ЗВОНОК CLEAR_LINE Сделать одну пустую строку ниже пункта 2AAF5C LD HL, (U_CURSOR) HL: = адрес верхней позиции курсора 3680 LD (HL), “твердый пространство”                                          Программа будет поздно признает это                                          как конец абзаца маркера 2180EA LD HL, # EA80 HL указывает на первый байт (сейчас пустой)                                          из L_TABLE 0603 LD B, # 03 В: = количество пробелов для отступа начала                                          следующего пункта 3680 E_INDENT LD (HL), “твердый пространство”                                          Абзац с отступом с твердым                                          пространства, которые не будут удалены с помощью                                          Компресс подпрограмма 23 INC HL найденные на следующий байт 10FB DJNZ E_INDENT Повторите в течение трех пространств FD7577 LD (L_CURSOR), L-магазин с отступом положение курсора C37CEC JP ВНИЗ Перемещение курсора внизу пустой строкой,                                          и выход

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

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

                     ORG ED5E

B6EC CTRL_TABLE DEFW CLEAR_LINE 40EC DEFW CLEAR_SCRN A7EC DEFW CAPS_LOCK 93EC DEFW EDIT 59EC DEFW ЛЕВЫЙ 63EC DEFW ПРАВО 7CEC DEFW DOWN 6DEC DEFW UP C1EC DEFW DELETE 2EED DEFW ENTER 1EEE DEFW ТВОЕ B0EC DEFW COPY_13

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

А теперь на минуту, что вы все ждали – это программа, которая связывает все эти подпрограммы вместе в один унифицированная программа. При вызове программы из BASIC это адрес, который вы должны обратиться к. Это самое начало разбирательства. Следует отметить, что, так как программа в одном Точка опирается на ценности системы переменной SEED бытия достаточно случайным, то вы не должны действительно использовать RANDOMIZE USR 60790. Вместо этого, вы всегда можете использовать Randomize 0 * USR 60790, или Пусть L = USR 60790, или даже мой собственный любимый немного изворотливый странность ЕСЛИ USR 60790, то (с чем после слова THEN).

Так или иначе, вот оно – это где это все на!

                     ORG ED76

218050 START LD HL, 5080 Это положение печати для                                          

                                         экрана

         

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

Первый

                     

                                        

                                        

                                                                                                                          

                                        

                                        

                                        

                                        прессованный

                                        символ

                                        

                                        характер

                                        

                                        звонить

Подумайте о том,

это …

                                        

                                        

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

                     

                                        найденный

                                        

                                        найденный

                                        

                                        

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

Глава.

Это будет

Любой

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

– Другой прекрасный продукт расшифрованы: Джим Grimwood (jimg@globalnet.co.uk), Weardale, Англия

Сыграйте в WordSheep прямо сейчас! Это текстовый процессор, который создал Toni Baker, был издан творческой группой ZX Computing в 1984 году в Великобритании.

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

Subscribe
Уведомлять об
guest
0 Comments
Inline Feedbacks
View all comments
 

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

  

Справка[X]

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

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

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

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

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

Помощь

Размер

  • x1 [256x192]
  • x2 [512x384]
  • x3 [768x576]
  • Полный

Диск

Кликни в окно эмулятора, чтобы управлять!
<<<<
Close
0
Would love your thoughts, please comment.x
()
x