СООБЩЕНИЯ ОБ ОШИБКАХ
*ERROR* 1 — ошибка в константе;
*ERROR* 2 — мнемоника не распознана;
*ERROR* 3 — утверждение сформировано неправильно;
*ERROR* 4 —символ (метка) определен более одного раза;
*ERROR* 5 — строка содержит недопустимый символ;
*ERROR* 6 — один из операндов в строке не определен;
*ERROR* 7 — метка является зарезервированным словом;
*ERROR* 8 — использование недопустимой для данной команды пары регистров;
*ERROR* 9 — использование недопустимого для данной команды регистра;
*ERROR* 10 — величина относительного смещения слишком велика;
*ERROR* 11 — инструкция не может быть оттранслирована;
*ERROR* 12 — ошибка в директиве ассемблера;
*ERROR* 13 — метка, используемая в команде, не определена;
*ERROR* 14 —деление на ноль;
*ERROR* 15 — переполнение при операции умножения;
*ERROR* 16 — вложенное макроопределение;
*ERROR* 17 — идентификатор не может являться именем макроопределения;
*ERROR* 18 — рекурсивный вызов макроопределения;
Bad ORG! — операндом директивы ORG является адрес, использование которого может испор-
тить ячейки GENS4, текстовый файл или таблицу символов. Управление возвращается в ре-
дактор;
No Symbol Table space! — появляется во время первого прохода, если под таблицу символов
выделено недостаточно памяти. Управление возвращается в редактор;
Out of memory! — нет места для текста программы. Рекомендуется записать текущий текстовый
файл или его часть на магнитный носитель.
ЗАРЕЗЕРВИРОВАННЫЕ СЛОВА
Все зарезервированные слова состоят из заглавных букв. Приведенные ниже слова нельзя ис-
пользовать как метки:
А В С D Е
Н L I R $
AF AF' ВС DE HL
IX IY SP NC Z
NZ М Р РЕ PO
Далее приводится список мнемоник команд Z80, директив я команд ассемблера:
ADC ADD AND BIT CALL
CCF CP CPD CPDR CPI
CPIR CPL DAA DEC DI
DJNZ El ЕХ EXX HALT
IM IN INC IND INDR
INI INIR JP JR LD
LDD LDDR LDI LDIR NEG
NOP OR OTDR OTIR OUT
OUTD OUTI POP PUSH RES
RET RETI RETN RL RLA
RLC RLCA RLD RR RRA
RRC RRCA RRD RST SBC
SCF SET SLA SRA SRL
SUB XOR
DEFB DEFAA DEFS DEFW ELSE
END ENT EQU IF ORG
MAC ENDM
*D *E *H *L *S
*C *F *M
ПРИМЕР СЕАНСА РАБОТЫ
Задача: написать и отладить программу, выводящую на экран числа в пределах от О до 65535 в
произвольной системе счисления.
Проект: программа должна состоять из двух подпрограмм — подпрограммы, подготавливающей
таблицу степеней, и собственно подпрограммы вывода числа на экран.
Ввод программы:
Полужирным шрифтом выделен текст, вводимый с клавиатуры, курсивом — пояснения. Исполь-
зованы следующие обозначения клавиш:
Enter;
[SP] - Space;
[SS/x] — одновременное нажатие клавиш Symbol Shift и х;
[CS/x] — одновременное нажатие клавиш Caps Shift и х.
Ввод строки программы заканчивается нажатием на клавишу Enter:
>II10,10^ автонумерация строк
Pardon? ошибка в командной строке
>I10,10^
10 ;отладочная часть*
20 ORG 40000 ;адрес размещения подпрограмм
*) Пример вводился и обрабатывался без комментариев.
30 ENT $ ;определение входной точки
4 0 CALL 3503 ;очистка экрана
50 LD A,10 ;установка системы счисления
60 CALL MAK_TB ; с основанием 10
70 LD HL,12345 ;печать числа
80 ;подпрограмма печати числа, содержащегося в HL
90 PR_NUM PUSH HL ;сохранение числа
100 PUSH HL ;создание рабочей копии
110 LD HL, (TB END) ;загрузка адреса конца таблицы
120 LOOP_1 DEC HL ;загрузка в DE очередной
130 LD D,(HL) ; степени числа, находящейся
14 0 DEC HL ; в таблице
150 LD E,(HL)
160 LD A,D ;проверка на достижение конца
17 0 OR Е ; таблицы
180 JR. NZ,CONT 1 ,продолжение, если не конец
190 POP HK ; восстановление SP
200 POP HL ;восстановление числа
210 LD А,13 ;АSCII-код 13 - перевод строки
220 RST 16 ;печать символа из А
230 RET ;возврат из подпрограммы
240
250 CONT_1 ЕХ (SP),HL ;восстановление числа
260 XOR А ;очистка А и сброс бита CY
270 LOOP 2 SBC HL,DE ' ;расчет очередного разряда
280 JR. C,PR CHR ; числа, результат помещается
290 INC A ; в А, а расчет заканчивается
300 JR LOOP_2 , ; при переходе через ноль
310 _
320 PR_CHR ADD HL,DE ;восстановл. полож. значения
330 ADD A,"0" ; получение ASdI кода
340 СР "9"+1 ;если код меньше, чем "9"
350 JR. C,CONT 1 ; то переход на печать
360 ADD А,"А"—"9"—1 ; коррекция кода
37 0 CONT 2 RST 16 ;печать очередной цифры числа
380 ЕХ (SP),HL ;восстан. адреса таблицы
3 90 JR LOOP_1
400 ; подпрограмма подготовки таблицы степеней, основание
410 ; степени должно быть помещено в аккумулятор
420 МАК_ТВ LD HL, TABLE+4 ;загрузка адреса таблицы
430 PUSH HL ;сохранение адреса
440 LD DE,1 ;инициал. счетчика степени
450 LOOP 3 LD B,A ;загрузка счетчика цикла
460 LD HL,0 ;обнуление результата
470 LOOP_4 ADD HL,DE ;подсчет степени
480 JR. C.READY ;окончание счета (>65535)
4 90 DJNZ LOOP_4 ;цикл подсчета
500 ЕХ DE,HL ;загрузка результата в DE
510 READY POP HL ;восстановление адреса таблицы
52 0 LD (TB END),HL ;запись адреса конца таблицы
530 RET С ;выход. при окончании счета
540 LD (HL),E ;запись очередного значения
550 INC HL ; степени в таблицу
560 LD (HL),D
57 0 INC HL
580 PUSH HL ;сохранение адреса таблицы
5 90 JR. LOOP 3 ;продолжение цикла
600 ; область данных
610 TB_END DEFW TABLE+2 ;переменная, содержащая адрес
620 ;конца таблицы
630 TBLE DEFW 0 ;таблица степеней, первые два
64 0 DEFW 1 ;значения — константы
650 DEFS 30 ;область для таблицы
660
67 0 END
680 [CS/1]
>A2^ вызов ассемблирования без построения кода
HiSoft GEN Assembler ZX Spectrum
1990 MOA B-Disk version.
Copyright (C) HiSoft 1987
V4.1 All rights reserved
9C58 190 POP HK
*ERROR* 01
^ обнаружена ошибка — продолжаем процесс
No Symbol Table space!размер таблицы символов мал
>A2,300^ ассемблирование с большим размером таблицы символов
HiSoft GEN Assembler ZX Spectrum
1990 MOA B-Disk version.
Copyright (C) HiSoft 1987
V4.1 All rights reserved
9C58 190 POP HK
*ERROR* 01
^
Pass 1 errors: 01
*WARNING* HK absent ПРЕДУПРЕЖДЕНИЕ: метка не обнаружена
*WARNING* TABLE absent
Table used: 187 from 300
>E190^ вызов на редактирование ошибочной строки
190 POP HK
190 X[CS/0]L^ редактирование осуществляется
190 POP HL последовательным нажатием
соответствующих клавиш
>L600^ просмотр части листинга
600
610 TB_END DEFW TABLE+2
620
630 TBLE DEFW О
64 0 DEFW 1
650 DEFS 30
660
670 END
>E630^ вызов на редактирование ошибочной строки
630 TBLE DEFW 0
630 [SP]IA^^
63 0 TABLE DEFW 0
>A,300^ ассемблирование с созданием кода
HiSoft GEN Assembler ZX Spectrum
1990 MOA B-Disk version.
Copyright (C) HiSoft 1987
V4.1 All rights reserved
Pass 1 errors: 00
Pass 2 errors: 00
Table used: 167 from 300
Executes: 40000
>R^ выполнение программы
12345
>D10,70^ удаление отладочной части
>N10,10^ перенумерация строк
>Р1,20000,1: UNINUMPR^ запись текста программы на диск
ЗАБАВНЫЙ ПРИМЕР ИСПОЛЬЗОВАНИЯ
КОМАНД УСЛОВНОЙ ТРАНСЛЯЦИИ
В соответствующем разделе говорилось, что использование вложения команд условной трансля-
ции недопустимо. Но, по сути, при последовательном использовании этих команд как такового
вложения не происходит. Каждая из команд условной трансляции самостоятельно управляет одним
и тем же флагом разрешения трансляции, и комбинации команд, которые на первый взгляд могут
показаться вложенными, на самом деле являются последовательными. Использование конструкций
с «лжевложениями» позволяет писать весьма элегантные программки:
ON_16 EQU 0 ; 1 — present, 0 — not present
ON_12 8 EQU 1
ON_BETA EQU 1
ON_MDRV EQU 0
CONFIG
IF ON_16
DEFM "16K"
ELSE
IF ON_12 8
DEFM "128K"
END
IF ON_16 ! 1
IF ON_12 8 ! 1
DEFM "4 8K"
END
DEFM " memory presented"
DEFB 13
IF ON_BETA
IF ON_MDRV
DEFM "Beta disk and Microdrive"
ELSE
IF ON_BETA
DEFM "Beta disk"
END
IF ON_BETA ! 1 & ON_MDRV
DEFM "Microdrive"
END
IF ON_MDRV @ ON_BETA I 1
DEFM "No drive devices"
END
DEFM " attached"
DEFB 13@ #80
В результате трансляции данного примера в памяти будет построен текстовый файл, содержа-
щий информацию о конфигурации внешних устройств, определяемых в заголовке программы.
ПРОГРАММА-ЗАГРУЗЧИК
Если Вы часто пользуетесь GENS4, то полезно написать небольшой загрузчик на Бейсике. Для
дисковой версии он может выглядеть следующим образом:
1 RANDOMIZE USR О
10 LET A=VAL "25000"
20 IF INKEY$<>"" THEN INPUT "New address: ";A
30 RANDOMIZE A: POKE VAL "23877",PEEK VAL "23670":
POKE VAL "23878",PEEK VAL "23671": CLEAR A-SGN PI
40 LET A=PEEK VAL "23670"+VAL "256"*PEEK VAL "23671"
50 RANDOMIZE USR VAL "15619": REM : LOAD "GENS4B"CODE A
60 POKE VAL "23824",NOT PI
70 GO TO NOT PI
После ввода текста программы с клавиатуры запишите ее на диск с помощью операторов:
CLEAR :РОКЕ 23868,0
RANDOMIZE USR 15 619:REM :SAVE "GENS4B"LINE 1
Приведенный загрузчик разместит GENS4 с адреса 25000, но если при запуске удерживается
какая-либо клавиша, то на экране появится запрос New address:, на который можно ввести про-
извольный адрес.
Перезапуск ассемблера после выхода в Бейсик осуществляется оператором RUN.
Для кассетной версии загрузчик будет выглядеть несколько иначе:
1 RANDOMIZE USR О
10 LET A=VAL "25000"
20 IF INKEY$<>"" THEN INPUT "New address: ";A
30 RANDOMIZE A: POKE VAL "23765",PEEK VAL "23670":
POKE VAL "237 66",PEEK VAL "23671": CLEAR A-SGN PI
40 LET A=PEEK VAL "23670"+VAL "256"*PEEK VAL "23671"
50 LOAD "GENS4B"CODE A
60 GO TO NOT PI
Для записи загрузчика на ленту выполните операторы:
CLEAR : POKE 23756,0
SAVE "GENS4"LINE 1