ZX Учебная: Машинный код (часть II)
Введение
В прошлом номере мы вкратце объяснили, что такое ассемблер и дизассемблер, но объяснение получилось очень поверхностным. Поэтому лучше обратитесь в Kompjuter biblioteka по адресу Bate Jankovića 79, 32000 Čačak (тел. 032/30-34) за руководством по ассемблированию с помощью GENS. Поскольку мы будем постепенно объяснять вам, что такое машинный язык, ассемблер ещё несколько номеров вам не понадобится — сначала вы должны узнать самые важные вещи, связанные с машинным кодом.
Память компьютера проще всего представить в виде длинного ряда ячеек, способных запомнить только то, что в них помещено.
Такая ячейка называется БАЙТОМ. Один килобайт содержит 1024 байта, а один мегабайт — 1024 килобайта, или 1048575 байт. Вас наверняка удивляет, почему вместо круглого числа 1000 мы используем 1024. Дело в том, что компьютер работает не в десятичной системе счисления, а в двоичной, и в ней число 1024 — вполне круглое. Теперь вы можете спросить: как же найти среди 65535 байтов Spectrum нужный мне байт? Ответ прост. У каждого байта есть своя метка, по которой его легко найти в памяти.
Эта метка называется АДРЕСОМ, а на самом деле это целое число от 0 до 65535. То есть у каждого байта есть номер, по которому его можно найти. Так, у первого байта номер 0, у второго — 1, у третьего — 2, у двухтысячного шестого — 2005 и так далее. Микропроцессор может найти любой бит в нём. Теперь вы спросите, что такое бит. Каждый байт состоит из восьми элементарных ячеек, которые мы называем БИТАМИ.
Каждый бит может быть установлен или сброшен: если он установлен, в нём хранится единица, а если сброшен — ноль. Поэтому весь байт можно представить и как двоичное число из восьми цифр. Бит 0 имеет наименьший вес, а бит 7 — наибольший.
Но вернёмся к тому, как и чем можно прочитать любой бит в памяти.
Это можно сделать и из BASIC — с помощью команды PEEK. Но нельзя просто написать PEEK 0 и ожидать, что компьютер покажет, что находится в байте 0. Сначала нужно написать PRINT PEEK 0. Тогда компьютер выведет число 243, то есть первый байт памяти содержит значение 243.
Пока это нам ничего не говорит, но если преобразовать это число в двоичное (отсюда и команда BIN), получится 11110011. Это означает, что первые четыре бита установлены, пятый и шестой сброшены, а седьмой и восьмой установлены.
Память разделена на два больших блока. Первые 16 КБ, от адреса 0 до 16383, составляют ROM (Read Only Memory — читается «рид онли мемори»). Это означает, что в эти ячейки памяти ничего нельзя записать: их только читает CPU. В ROM производитель записал все инструкции, необходимые для правильной работы компьютера; они сохраняются и после его выключения.
Вот ещё один расчёт, который поможет вам понять размер ROM: 16 × 1024 = 16384. Оставшаяся память, начиная с адреса 16384, называется RAM (Random Access Memory). Достаточно знать, что в неё можно записывать всё, что угодно, на свой страх и риск.
К этим байтам, от 16383 до 65535 (то есть 48 × 1024 = 49152 байта), доступ полностью свободен, но при выключении компьютера все данные из RAM безвозвратно теряются.
Записывать в байты что угодно можно и прямо из BASIC с помощью команды POKE N,M, где N — номер байта, а M — его значение.
Например, POKE 23609,255 заставит компьютер издавать звук при нажатии клавиш, а это значение в битах выглядит так: 255 = 11111111.
Следует также отметить, что знать структуру всей памяти компьютера необходимо: бездумное использование POKE чаще всего приводит к сбою и перезагрузке компьютера.
КАРТА ПАМЯТИ
Адреса Данные
0 ROM
16384 Видеопамять, данные о содержимом изображения
22528 — Информация о цвете, яркости и мигании
23926 — Память для работы с принтером
23552 — Системные переменные
23734 — Данные для работы с микродрайвом
| Адрес / имя | Данные |
|---|---|
| CHANS | Информация о каналах, служащих для обмена данными с периферийными устройствами |
| PROG | Программа на Бейсике. Этот адрес обычно… |
| VARS | Переменные программы на Бейсике |
| E_LINE | Содержимое редактируемых строк |
| WORKSP | Данные для ввода командой INPUT и данные, используемые при сложении строк |
| STKBOT | Стек компьютера — временная память, используемая при вычислениях |
| STKEND | Свободное пространство |
| Spare | Машинный стек |
| Стек GOSUB | |
| RAMTOP | Здесь начинаются данные, недоступные программе на Бейсике |
В заключение хочу порекомендовать вам ознакомиться с системными переменными, расположенными по адресам от 23552 до 23734. Подробно о них можно прочитать в руководстве к Spectrum. Они очень важны для программирования на машинном языке.
Материал подготовил:
Žosić Saša
Podgaj 11
71000 Sarajevo
ZX Идеи
а) Поиск экранных картинок
б) Дни недели
а) Поиск экранных картинок
Во многих играх есть целые экранные картинки, которые не видны во время загрузки, а появляются только в процессе игры. Если вам любопытно и вы хотите их увидеть, а может быть, даже сохранить, воспользуйтесь этой программой — она поможет найти картинки.
Нажмите клавишу L и загрузите блок, в котором, как вы предполагаете, находится экранная картинка. Ищите её клавишами 1, 2 и 9, 0.
Когда найдёте картинку, нажмите A, чтобы увидеть её цвета.
Если экран окрасится странным образом, нажмите O (букву O, а не ноль), и всё снова будет в порядке. Если вы нашли картинку и хотите её сохранить, нажмите S, введите имя картинки и сохраните её на ленту. Сохранённую картинку можно загрузить обычной командой LOAD SCREEN.
Обратите внимание: строки DATA нужно набирать строчными буквами.
15 CLEAR 40000:PRINT TRENU TAK...
20 FOR l=1 TO 35:READ ač:LET k=0
30 FOR a=0 TO 7:GO SUB 100:POKE d,b:LET k=k+b:LET d=d+1:NEXT a
40 GO SUB 100:LET p=b:GO SUB 100:LET p=p+b!256:IF p<>k THEN PRINT GRE$KA U LINIJI BROJ ;1000+(l-1)!10' POPRAVI JE I PONOVO START UJ PROGRAM SA RUN :STOP
50 NEXT l
60 CLEAR :PRINT DEKODOVA NJE ZAVR$ENO SNIMI PROGRAM :RANDOMIZE USR
70 STOP
100 LET y=CODE ač-48:LET y=y-39!(y>9):LET z=CODE ač(2)-48:LET z=z-39!(z>9):LET b=16!y+z:LET ač=ač(3 TO ):RETURN
1000 DATA 000000210100cd6e5d01
1010 DATA 19e521cf07cd6e194
1020 DATA d1cde51921ee0722d
1030 DATA 425c3e0132445cc97
1040 DATA d2ffcd3e08326a5cdc03
1050 DATA afcd0116184f3e013
1060 DATA 8677d2c3ff3f23342
1070 DATA c3c3ff7e160192772
1080 DATA d2c3ff3f2335c3c3b
1090 DATA fffdcb01ae76fdcbb
1100 DATA 016e28f93a085c214f02
1110 DATA e8fffe3228d9fe314
1120 DATA 28e32bfe3028c7fe5
1130 DATA 3928d0fe532844feec03
1140 DATA 4c2845fe412816fe3
1150 DATA 4f2828185fed4be73
ff606911004001001a02
1170 DATA 18edb01855ed4be74
ff6069af110018ed8d03
1180 DATA 5a11005801c002ed7
1190 DATA 60183f01c0022100eb01
1200 DATA 581101583e3877ed9c02
1210 DATA b0182fed4be7ffc9de04
1220 DATA dd21a76111619dafc
1230 DATA d3fe3708cd5905dd1
1240 DATA e5e111a97cafed52ea04
1250 DATA 38e611a861ed53e75f04
1260 DATA ffc30affaf32085c1
1270 DATA 189b3e16d7afd7af1
1280 DATA d7af11e9ffcd0a0c6
1290 DATA ed4be7ffcd2b2dcd1
1300 DATA e32d3e06d7c330ff1d04
1310 DATA a861807f204a616e4
1320 DATA 6b6f205354414d457
1330 DATA 4e4f56494316019a3
1350 STOP
2000 LET bc=USR 65290:DIM ač (9):INPUT IME?
LINE ač:LET ač=CHRč 170+ač
2010 SAVE ačCODE bc,6912:RUN
2020 CLEAR 24998:LOAD CODE:RUN
2030 SAVE SCR TRAGAč LINE 2020:SAVE SC.T.CODE CODE 65290,246
Материал подготовил:
ZX Учебная: Машинный код (часть II)
Фрагмент 3/5.
Pajović Nenad
V. KaraŠorŠa 22
15004 Jelenča
б) Дни недели
10 REM ! LLIST ZX-SPECTRUM !
20 DIM X$(7,10)
30 DATA ВОСКРЕСЕНЬЕ,ПОНЕДЕЛЬНИК
40 DATA ВТОРНИК,СРЕДА,ЧЕТВЕРГ
50 DATA ПЯТНИЦА,СУББОТА
60 FOR I=1 TO 7
70 READ X$(I)
80 NEXT I:CLS
90 PRINT AT 0,0
100 PRINT "ВВЕДИТЕ ДАТУ:"
110 INPUT "ГОД=";G:LET G=INT G
120 PRINT "ГОД=";G
130 INPUT "МЕСЯЦ=";M:LET M=INT M
140 IF M<1 THEN GO TO 130
150 IF M>12 THEN GO TO 130
160 PRINT "МЕСЯЦ=";M
170 INPUT "ДЕНЬ=";D:LET D=INT D
180 IF D<1 THEN GO TO 170
190 IF D>31 THEN GO TO 170
200 PRINT "ДЕНЬ=";D
210 LET Y=G:LET Q=M
220 IF M>2 THEN GO TO 240
230 LET Y=G-1:LET Q=M+12
240 LET A=INT (Y/100)
250 LET B=2-A+INT (A/4)
260 IF G>1582 THEN GO TO 290
270 IF M>10 THEN GO TO 290
280 IF D<15 THEN LET B=0
290 LET J=INT (365.25*Y)
300 LET J=J+INT (30.6001*(Q+1))
310 LET JD=J+B+D+1720994.5
320 LET I=(JD+2)/7
330 LET I=1+INT (7*(I-INT I))
340 PRINT AT 10,0;"ДАТА:"
350 PRINT D;"/";M;"/";G;" ГОД"
360 PRINT "ГРИГОРИАНСКОГО КАЛЕНДАРЯ"
370 PRINT "ЭТО: ";X$(I)
380 GO TO 90
Приложение подготовил:
Pajović Nenad
V. KaraŠorŠa 22
15004 Jelenča
Поделитесь вашим мнением о статье