CPCRULE AMSTRAD КОДУВАННЯ ЦПК

БАЗОВІ ЗНАННЯ

ШЕСТИДЦЯТОВНЕ ПОЗНАЧЕННЯ: СИЛЬНИЙ І СЛАБКИЙ БАЙТ

Якби ми справді хотіли, все одно можна було б працювати машинною мовою, надаючи комп’ютеру дані у формі, яку всі знають: десяткове позначення.
Однак із низки причин це не рекомендується. Ми можемо навести три:

  • У будь-якому випадку при розробці програми будуть потрібні певні шістнадцяткові перетворення.
  • Шістнадцяткова нумерація займає менше місця, ніж десяткова нумерація (зокрема для чисел більше 99).
  • Усі твори без винятку, що стосуються цієї або суміжної теми, використовують шістнадцяткові позначення. Ви можете одразу звикнути.

Щоб дізнатися, що це саме, почніть, набравши це на своїй машині (буде достатньо прямого режиму, тобто немає необхідності вводити номер рядка):

ДРУКУВАТИ ШЕСТИГРАДНИЙ $ (43870)

Відображається відповідь: AB5E. Функція HEX $ змінила десяткове подання 43870 на шістнадцяткове. Дві цифри або літери праворуч називаються найменш значущими байтами, а дві ліворуч - найзначнішим байтом (у прикладі найменш значущим байтом є 5E і найбільш значущим байтом AB).
Зауважте, що комп’ютер не заважає писати 0, можливо, знаходиться зліва від останньої цифри або останньої літери.

2060 представлений у шістнадцятковій системі 80C, що еквівалентно 080C. Отже, найменш значущим байтом є OC, а найбільш значущим байтом 8.

HEX $ (255) = FF, що еквівалентно OOFF. У цьому випадку найменш значущим байтом є FF, а найбільш значущим байтом 0 (або, якщо хочете, сильного байта немає - проте ми побачимо, що нюанс може бути важливим).
Зворотне перетворення (шістнадцяткове - десяткове) можна виконати наступним чином:
Число в десятковому = найменш значущий байт + (256 * найзначніший байт)

HEX $ (648) = 288 та & 88 + 256 * & 2 = 648

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

  1. Шістнадцяткове подання чисел в діапазоні від - 32768 до - 1 таке саме, як і чисел від 32768 до 65535 (приклад: HEX $ (- 21) = FFEB та HEX $ (65515) = FFEB).
  2. Отже, зробити шістнадцяткове десяткове перетворення насправді є дві можливості:
  • Якщо ми не хочемо брати до уваги знак (якщо знаємо, наприклад, що число позитивне), ми використовуємо формулу, представлену вище.
  • Якщо ви хочете врахувати знак, вам доведеться скористатися функцією UNT. "

UNT (& FFEB) = - 21 та & EB + 256 * & FF = 65515

ПРОСТІ РЕЄСТРИ

Щоб дати чітке уявлення про це, ми могли б сказати, що програмування машинною мовою значною мірою полягає у маніпулюванні різними "ящиками", в які можна поставити значення, і які можна, наприклад, додавати і віднімати. між ними. Кожне з цих вікон, що називається реєстром, має своє ім'я. Наразі ми зупинимось на семи з цих реєстрів: A, B, C, D, E, H та L.
Для інформації уточнимо, що регістр А також називають накопичувачем.
Однак ці прості регістри, які вони є корисними, мають серйозний недолік: ми можемо ставити лише цифри від 0 до 255. Ось чому існують також подвійні регістри.

ДВОЙНІ РЕЄСТРИ

Насправді це прості регістри, покладені два на два. Ми будемо використовувати три: BC, DE та HL.
У цих подвійних регістрах ми можемо поставити цифри до 65535. Саме тут увійдуть в дію поняття малого та великого байтів.
Щоб помістити, наприклад, значення & AB5E (43870 в десяткових цифрах) в регістр HL, потрібно буде поставити (ми також говоримо, що завантажуємо) старший байт цього значення в H і низький байт у L. Після завантаження HL буде виглядати так:

amstrad

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

На закінчення давайте, нарешті, зазначимо, що нам також доведеться використовувати дещо спеціальний подвійний регістр, IX реєстр. Цей регістр називається індексним регістром.

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

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

Це основний принцип стека: останній введений елемент, перший елемент вийшов (англійською мовою, це стек LIFO Last In/First Out).
Якщо з забобонів чи фантазії ви абсолютно хотіли спочатку промити червону тарілку, вам би довелося заздалегідь підняти жовту та синю, щоб взяти червону.

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

ПОКАЗНИКИ РЕЄСТРУЮТЬСЯ

Це реєстр, який ми не будемо використовувати безпосередньо, і, знову ж таки, не потрібно турбуватись зайвими деталями. Достатньо уявити цей реєстр як вікно, що містить вісім вікон, або індикаторів, кожен з яких має номер, а іноді і назву:

У кожному з цих "ящиків" може бути 1 або 0: ми говоримо, що такий самий показник встановлений на 1 або 0.
Ми ніколи не торкаємося змісту цього реєстру, це особиста справа процесора. Нас цікавитимуть лише показники 7 або 6, роль яких:
Протягом курсу програми та після певних операцій процесор встановлює прапори 6 та 7 на 1 або 0, залежно від результату.

  • Якщо результат операції дорівнює нулю, прапору 6 буде встановлено значення 1. В іншому випадку йому буде встановлено значення 0. (Слово "операція" слід сприймати тут у широкому розумінні. Порівняння між значеннями є, наприклад, операцією з тим самим заголовком як доповнення.)
  • Якщо результат операції є позитивним, для показника 7 буде встановлено значення 1. Якщо він буде негативним, для показника 7 буде встановлено значення 0.

Індикатор 6 називається нульовим індикатором (Z), а індикатор 7 (S).
Знову ж таки, цим усім займається машина, і нам не доведеться про це турбуватися. Інтерес, тим не менш, очевидний: оскільки є інструкції для тестування показників, ми можемо зробити умовні гілки на зразок: "Якщо показник 7 дорівнює 1, то потрібно зробити те чи інше".
Це насправді точно можна порівняти з інструкцією BASIC IF.

Певні операції не передбачають будь-яких змін показників, і це незалежно від результату. Крім того, деякі умовні інструкції можна використовувати лише як функцію, наприклад, прапорця 6, а не як функцію 7 (або навпаки).
Все це зазначено у п’ятій частині, яка узагальнює та формально пояснює частину інструкцій Z 80.

CPC - це комп’ютер з оперативною пам’яттю (оперативна пам’ять) 64 КБ, що означає 64x1024 = 65 536 байт або слоти пам'яті, кожен з яких має адресу від 0 до 65535.
Насправді частина цих слотів пам'яті зарезервована для таких речей, як управління екраном або інтерпретатор BASIC, а користувачеві залишилося лише 43 536 байт (з адреси 368 до 43903), c 'це сказати не зовсім 43K.

Коли ви пишете програму BASIC, вона кодується машиною і зберігається, починаючи з найменшої адреси (368). Чим довше програма, тим більше пам'яті заповнюється. Крім того, може трапитися так, що для виконання програми потрібні слоти пам'яті за найвищими адресами (43903 і нижче).
Проблема полягає в тому, що для наших машинно-мовних програм нам доведеться мати захищену зону, де ми можемо їх розмістити, і де вони не ризикують бути порушеними або «перезаписаними» BASIC. Для цього ми використаємо інструкцію MEMORY, яка дозволяє вам вільно встановити обмеження, яке BASIC не може переступити ні за яких обставин. Якщо, наприклад, ми набираємо:

ПАМ'ЯТЬ 10000

слоти пам'яті в діапазоні від 10001 до 43903 залишаться незайманими будь-якими вторгненнями, а BASIC залишатиметься обмеженим між адресами 368 і 10000. Це лише приклад, і на щастя нам не доведеться резервувати пам'ять зон як важливу. Наприклад, 500-байтна машинно-мовна програма - це вже досить велика програма. Ті, які ми запропонуємо вам у цій роботі, обертаються приблизно на 100 або 200 байт. Таким чином, пам'яті 43600 було б цілком достатньо, втрата пам'яті незначна і швидко амортизувалася.

Заощаджений таким чином простір пам’яті ми будемо використовувати двома способами: з одного боку, щоб написати там свої інструкції, а з іншого боку, хоча і рідше, для зберігання даних.
У цьому відношенні слот для пам'яті працює трохи як регістр, оскільки ми можемо поставити лише числа, менші або рівні 255. Щоб помістити в нього більші числа, вам доведеться використовувати два слоти пам'яті і поставити один l 'низький байт а в іншому старший байт.

Зараз важливо чітко відрізнити адресу скриньки пам'яті від її вмісту.

Ящик адресної пам'яті 43000 (& A7F8) Ящик адресної пам'яті 43001 (& A7F9)
Ящик пам'яті з адресою 43000 містить значення & D1, а в адресі 43001 - значення & B0.
Традиційно вміст слота пам'яті з адресою n пишеться (n). Тому ми можемо записати: (43000) = & D1 та (43001) = & B0.

Z80 ІНСТРУКЦІЯ

Процесор Z 80 має значну кількість основних вказівок: 158. Що стосується нас, ми будемо задоволені використовувати 35, і ви побачите, що з цим зменшеним числом вже можна зробити певну кількість. речей.
Інструкція має форму одного або декількох чисел, які ми запишемо у шістнадцятковій формі. Ці числа завжди менше або дорівнюють 255.

& 19 означає: "Додати регістри HL і DE".
& DD, & 2B означає: "Зменшити (= вилучити 1) регістр IX".

Тому фізично програма машинної мови постає досить просто у вигляді серії чисел, записаних у комірки пам'яті одне за одним.

ПРОГРАМИ РОБОТИ СИСТЕМИ

CPC не є егоїстом, і він пропонує нам, дуже дорого, отримати доступ до процедур своєї операційної системи. Ці підпрограми або підпрограми є частиною вбудованих програм, які підтримують роботу комп’ютера. Кожен із них має дуже точну адресу, їх можна викликати точно так само, як називається підпрограма в BASIC завдяки інструкції GOSUB.

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

Якщо, наприклад, нам потрібно обчислити синус кута, нам просто потрібно викликати адресну процедуру & BD88. Звичайно, для кожного з них необхідно знати, якими є способи виклику (щоб знову взяти попередній приклад, де необхідно вказати значення кута перед викликом рутинного синуса, а де результат при поверненні з цієї рутини?).

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

CPCrulez [Система управління вмістом] v8.7-desktop/c
Сторінка створена за 295 мілісекунд і переглянута 871 раз