Zx асемблер - розділ 8 - уявлення двійковій-десяткових чисел

П рслставленіс лвоічно-коліровать лесятічних чисел.

Двійковій-кодоване десяткове подання по англійськи скорочується як BCD
(BINARY-CODED DECIMAL). Зто - один із способів подання інформації в десяткового фор-
ме.

Щоб закодувати кожну з цифр від 0 до 9 необхідно всього 4 біти, і 6 допустимих
кодів не будуть у зтом поданні використовуватися.

Оскільки для кодування десяткової цифри необхідно 4 біта, в кожному байті можна за-
кодувати дві цифри. Зто називається двійковій-кодованим десятковим поданням.

Наприклад, 0000 0000 -двоічно-кодоване десяткове предста-
тичних десяткового числа 00
1001 1001 -двоічно-кодоване десяткове предста-
тичних десяткового числа 99.

Арифметичні дії над двійковій-кодованими
десятковими числами

Зта дивна система позначень для представлення чисел може повести до потенційних
проблемам при додаванні і відніманні,
спробуємо скласти наступні числа
BCD 08 0000 1 «00
BCD 03 0000 0011

BCD І 0000 1011

Ви помітите, що результат другої операції невірний і є неприпустимі * в представ
лення двійковій-кодованому десятковим числом. Для компенсації цих труднощів необхідно
застосовувати особливу команду, "DAA", яка називається "десяткова настройка арифметичних
дій ", щоб виправити результат складання, (тобто додавати 6, якщо результат превиша-
ет 9).

Наступну труднощі ілюструє той же приклад, буде генеруватися біт перенесення з
молодшого розряду двійково-кодованого десяткового числа (найпершого) в самий лівий.
Цей 'внутрішній перенесення повинен бути врахований і доданий до другого розряду двійково-кодірован-
ного десяткового.

Для виявлення цього перенесення використовується "прапор половинного перенесення", "н".

ld а, 12н: load literal bcd "12"
add а. 24Н: add literal bcd "24"

daa: D ecimal adjust result

LD (ADDR), a: STORE RESULT
LOAD LITERAL - завантажити літерал- ADD LITERAL - додати літерал; DECIMAL ADJUST RESULT -
десяткова настройка результату STORE RESULT - запам'ятовування результату.

При програмуванні вам навряд чи буде потрібно двійковій кодоване десяткове
уявлення. Але непогано знати, що чіп Z80 все-таки підтримує цю виставу, і
команда DAA полегшує життя невеликій групі користувачів двійковій-кодованого десятіч-
ного уявлення.

Переривання це посилається мікропроцесора сигнал, який може з'явитися в будь-який
час і, взагалі кажучи, призупинить виконання поточної програми (так, що програма да-
само не дізнається про це).

Z80 надає три механізму здійснення переривань: запит шини (BUSRG), не-
маскируемое переривання (NMI) і звичайне переривання (INT).

^ З ^ точки зору програмування ми розглянемо тільки звичайне маскируемое переривання

Команда DI (блокування переривання) застосовується для скидання (маскування), а команда EI
(Розблокування переривання) для установки (размаскірованія).

У загальному випадку звичайне переривання призведе до того, що поточний лічильник команд буде
поміщений в стек, а управління (в оригіналі можливо помилка. Переклад дається за змістом. (
прямуючи. пер. ). За допомогою команди RST буде передано на нульову сторінку ПЗУ. для повер
щення з переривання потрібно команда RETI (повернення з переривання).

При нормальному режимі роботи у "спектрум" переривання розблоковані (EI), і на самому
справі програма переривається 50 раз в секунду. Зто переривання дозволяє програмі ПЗУ осу-
вати сканування клавіатури.

Вам може знадобитися заблокувати переривання у вашій програмі, оскільки це прискореного
ряется виконання. Ви все-таки зможете отримувати інформацію з клавіатури, при умов
використання своєї власної програми для цього. Обов'язково розблокуйте прерива-
ня, коли закінчите виконання програми, оскільки інакше система не зможе отримувати ін-
формацію з клавіатури.

Команла рестарту (RST)

Зто - швидше за все "рудименти" чіпа 8080, реалізовані в цілях сумісності. Тому
ви навряд чи станете застосовувати команду RST в своїй програмі.

Перевага команди RST полягає в тому, що часто використовуються підпрограми можна дзв
вать, витрачаючи на це всього один байт. Крім того, команда RST займає мение часу,
ніж команда CALL.

Недоліком команди RST є те, що її можна застосовувати тільки для звернення до од-
ної з восьми наведених вище допустимих осередків.

Оскільки всі ці осередки розташовані в ПЗУ, ви можете скористатися цим поеімушест-
вом у своїй власній програмі. Є, однак, можливість використовувати підпрограми
ПЗУ. якщо ви знаєте, що вони роблять, і тим самим використовувати команди RST.

б зможете більше дізнатися про командах RST з нашої книги "UNDERSTANDING YOUR SPECTRUM",
написаної доктором Яном Логаном.

Написання програм аая "Спектрум"
Планування вашої програми на машинній мові

Програмування на машинній мові має надзвичайної гібкрртио в тому сенсі, що
дозволяє вам робити все, що завгодно. '

Оскільки від всіх мов більш високого рівня в кінцевому рахунку потрібно переходити до ма-
шинному мови, все, що ви можете запрограмувати на мові "фортран" або "кобол", або
будь-якому іншому, можна запрограмувати на машинній мові.

Додатковою перевагою є те, що програма на машинній мові вьполнять
швидше.

Зта абсолютна гнучкість може, однак, виявитися пасткою для необережного програм-
мист. При наявності такої повної свободи, можна робити все, що завгодно. На відміну від опера
ної системи "спектрум" для мови Бейсік ", наприклад, відсутні перевірки пропозицій
на допустимість.

Оскільки будь-які вводяться вами числа будуть командами того чи іншого типу, чіп Z80 буде
обробляти всі на світі.

Але навіть не беручи до уваги проблеми перевірки допустимості синтаксису, потрібно відзначити,
що програмування на машинному мові не накладає обмежень на використовувану вами
логіку: ви можете виконувати функції, переходи і т.п. які будуть абсолютно неприпустимі
в будь-якій мові більш високого рівня.

Тому величезне значення набуває самодисципліна при розробці програм на машин-
ном мовою. Неможливо перебільшити значення концепції "спадного" підходу в программі-
ровании в цілому, але особливо це стосується програмування на машин ном мовою.

"Спадний" підхід змушує вас розбивати задачу на більш дрібні одиниці і позволя-
ет перевірити логіку вашої розробки, протягом довгого часу не записуючи жодної
рядки тексту програми.

Припустимо, вам захотілося написати програму посадки на місяць:
найперший шлях міг би нагадати щось подібне:
INSTR видача на екран інструкцій

перехід назад на INSTR, поки Ви не натиснете

DRAW намалювати ландшафт. почати рух, що спускається

апарату з вершини екрану
LAND рух апарату, що спускається

якщо пальне скінчилося, перейти на CRASH
перейти назад на LAND, якщо поверхня не
досягнута
GROUND надрукувати поздоровлення

перейти назад на INSTR для наступного прогону
CRASH надрукувати співчуття з приводу невдалої по-
садки

перейти назад на INSTR для наступного прогону.

Зверніть увагу, що вся ця "програма" написана російською мовою. На цьому зтапах НЕ
приймалося жодних рішень, чи буде програма писатися на мові "бейсик" або на машин-
ном мовою. Таке рішення і не потрібно приймати - концепція програми посадки на Місяць не
залежить від способу запису її тексту.

Тепер настає зтап логічної перевірки.

Ви виконуєте роль ЗВМ і дивіться, чи всі можливості, які ви хотіли включити в
програму, є в наявності.

Чи немає переходів на об'єкти, які ви хотіли написати, але забули? Чи всі є? немає

Чи надлишкових програм. Чи не слід деякі об'єкти перенести в підпрограми.

Давайте знову подивимося на програму "- ох-ох-ох! - № забули як-небудь закінчити
програму!

Описана вище логіка може бути прекрасною для деяких прикладних задач, таких як
ігрова ЕОМ, але в своїй програмі вам може прийти в голову, що непогано б мати можли
ність вимкнути роботу програми.

Тепер ми змінимо останню частину програми наступним чином:
GROUND надрукувати поздоровлення
перейти на

CRASH надрукувати співчуття з приводу невдалої по-
садки

FINISH запитати гравця, чи потрібно закінчити
якщо немає, перейти на INSTR
якщо так, STOP

Зверніть увагу, що ми використовували мітки для опису певних рядків програм-
ми. Мітки - дуже цінний апарат, особливо якщо ви будете вибирати їх короткими і утримуючи
тільними.

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

Наприклад, ми можемо таким чином розписати модуль "FI- NISH", наведений вьвве:
FINISH очистити екран

надрукувати: "чи хочете закінчити?"
Опитати клавіатуру в очікуванні відповіді
якщо відповідь = так, то закінчити
перейти на INSTR

Ще одна перевага спадного підходу полягає в тому, що ви можете тестувати і
виконувати конкретний модуль автономно, так що він буде налагоджений для включення в оконча-
вальний текст програми.

Давайте спустимося ще на один рівень і подивимося на рядок очистити зкран більш під-
робно.

На цьому етапі нам потрібно вирішити, якою мовою ми будемо писати програму, і давайте
виберемо машинний мову "Сінклера".

Якби ви писали програму на мові "бейсик", то вам було б достатньо написати:
900 CLS,

але на машинній мові це просте речення "очистити екран" може виявитися обманчівьм.
(Так в оригіналі, що відкриває дужки немає. (Прим. Пер.))
П оетому ми могли б зробити що-то в такому роді:
CLEAR знайти початок екрану

заповнити наступні 6144 позиції пробілами
№ все ще не написали жодного рядка тексту програми, але, очевидно, підхід заснований на
машинній мові. Давайте подивимося пильніше, що повинна робити ця програма
очищення екрану і що вона робить насправді.

Ви, можливо, пам'ятаєте з керівництва по "спектрум", що екран складається з 6144 осередків та
що є ще 768 осередків, що описують атрибути екрану: колір паперу, колір чорнила і т.п.

Наведене вище короткий опис програми, звичайно, очистить частина екрану, але ніяк
не вплине на файл атрибутів. Якщо не у всіх позицій екрану збігається колір паперу або
якщо позиції деяких літер мають включені атрибути миготіння або яскравості, то ясна
програма очищення екрана, наведена вище, виявиться явно неадекватною.

Нам доведеться також обробити і файл атрибутів. (Зверніть увагу, наскільки складніше
виявляються деякі завдання на машинній мові, ніж на мові "бейсик")

Тому нам потрібно розширити програму до такого вигляду
знайти початок екрану

заповнити наступні 6144 байта пробілами
знайти початок файлу атрибутів

заповнити наступні 768 байтів необхіднимизначеннями атрибутів паперу (чорнила)
Наступного нижче лежить рівень - це вже той; на якому ви повинні, нарешті, писати

текст програми, так що давайте подивимося, як екран заповнюється просунув:

CLEAR LD HL, SCREEN: SCREEN START
LD вс, 6144: BYTES то CLEAR
LD D, 0: D = BLANK

LOOP LD (ftL), D: FILL BLANK
INC HL: NEXT POSITION
DEC нд: REDUCE COUNT
LD а, в

OR c: TEST IF bc = 0

JR NZ, LOOP: AGAIN IF NOT END

SCREEN START-початок екрану; BYTES то CLEAR - очищаються байти: BLANK - пробіл; FILL
BLANK - заповнення пропуском: NEXT POSITION - наступна позиція; REDUCE COUNT - зменшення
лічильника; TEST - перевірка; AGAIN IF NOT ENL - повторення, якщо не досягнуть кінець.

Тепер ви досить легко можете працювати з програмами такої довжини і таким способом
будувати досить великі програми.

До речі, ви тепер без сумніву розумієте, чому програми на машинній мові часто так
великі за обсягом і чому люди винайшли програми на мовах високого рівня!

Є кілька "правильних" відповідей - єдина перевірка буде це працювати?
Іншими словами, чи робить програма то, що вам потрібно.

За допомогою DJNZ ":
CLEAR LD HL, SCREEN
LD a, 0

LD в, 24: SET в = 24
BIGLOOP PUSH нд: SAVE VALUE
LD в, a: SET в = 256
LITLOOP LD (ftL), a:

INC HL: FILL IN 256 BLANKS
DJNZ LITLOOP

pop нд: GET BACK VALUE OF В
DJNZ BIGLOOP: DO IT UNTIL END

SET - встановити; SAVE VALUE - запам'ятати значення; FILL IN 256 BLANKS - заповнити 256
прогалин; GET BACK VALUE OF в - отримає назад значення в; DO IT UNTIL END - виконувати до
досягнення кінця.

№ змогли використати 24 рази по 256 (= 6144) для очищення екрану.

Потрібно відзначити наступне:

Ми можемо поставити в = 0, щоб пройти цикл DJNZ 256 раз. (Чому?) Зта процедура зазвичай
не застосовуватиметься в програмі, якщо ми тільки не станемо використовувати регістр з для
Доуг цілей.

CLEAR LD HL, SCREEN: SOURCE
PUSH HL
pop DE

INC DE: DEST = HL + 1
LD вс, 6144: HOW MANY
LD (HL). 0: LAT POS = 0
LDIR: MiVE IT

SOURCE - джерело; HOW - скільки; LAT - перша; MOVE - пеоемеценіе.

Зверніть увагу, що ми отримали DE = HL + 1, задаючи DE = HL і даючи приріст DE.
Зто можна зробити простіше, завантажуючи значення SCREEN + 1 в DE безпосередньо, але для woro
потрібно на один байт більше!

Причина, по якій ця команда LDIR спрацьовує, полягає в тому, що використовується
факт, що в процесі обробки дані перезаписувати в блок. Тут відбувається примене-
ня з позитивним результатом завдання, розглянутої нами в главі про переміщення блоків.

Якщо підсумувати потрібну пам'ять, то при першому методі потрібно 14 байтів, при
другому - 16 байтів, а при останньому 13 байтів.

Розділ 2 - як виконати програму на машинній мові. Вила алрссадіі в ZX SPECTRUM.

Розділ 3 - прапори і їх застосування. Увеліченіне і зменшення чисел. Арифметичні операції готівка 8-ра зрялнимі числами.

Розділ 4 - логічні оператори. Робота з 16-бітовими числами.

Розділ 5 - робота зі стеком. Арифметичні дії. Цикли і переходи.

Розділ 6 - операції готівка блоками. Більш Релком використовувані команли Z80.

Розділ 7 - установка і скидання бітів. Зрушення. Введення і виведення.

Розділ 8 - уявлення двійковій-десяткових чисел. Переривання. Команла рестарту (RST).

Розділ 9 - кошти "ZX спектрум".

Розділ 10 - мониторная програма EZ СОРЕ.

Розділ 11 - Мониторная програма завантаження тексту програми на машинній мові в шсстналдатерічном Форматі HEXLOAP.

Розділ 12 - таблиця перетворення десяткових чисел.