Программируем Апогей

Добрый день!


Решился я наконец написать серию статей о программировании для апогея. Упор в них будет делаться на его архитектуру, вниманию, собственно, программированию будет уделяться меньше, так как подразумевается что вы знакомы с программированием и знаете z80. Итак, начнём!

Сначала давайте скачаем нужные программы. Скачаем ассемблер+набор утилит и скачаем настроенный эмулятор. Ассоциируем файлы .rka с емулятором emu. Продолжаем.
Теперь нам надо изучить ассемблер i8080. i8080 — это z80, у которого:
1. Нет индексных регистров IX,IY
2. Нет второго банка регистров
3. Нет цикличных операций LDI,LDIR…
4. Нет некоторых операций чтения/записи, например ld (nnnn),BC и DE
5. Нет коротких переходов
6. Другие мнемоники.
На последнем надо остановиться поподробнее, так как это основная сложность при переходе z80-i8080 и обратно. Вот таблица соответствий.
ld r,r — mov r,r
ld r,i — mvi r,i
ld r,(hl) — mov r,m
ld a,(nnnn) — lda nnnn
ld (nnnn),a — sta nnnn
ld hl,(nnnn) — lhld nnnn
ld (nnnn),hl shld nnnn
ld a,(bc/de) — ldax b/d
ld (bc/de),a — stax b/d
ex de,hl — xchg
add a,r/(hl) — add r/m
add a,i — adi i
adc r — adc r
adc i — aci i
sub — sub,sui
sbc — sbb,sbi
inc r/(hl) — inr r/m
dec r/(hl) — dcr r/m
inc bc/de/hl — inx h
dec bc/de/hl — dcx h
add hl/de/bc dad b/d/h
daa — daa
and — ana,ani
or — ora,ori
xor — xra,xri
cp — cmp,cpi
neg — cma
инвертировать перенос (непомню мнемонику) -cmc
сдвиги — rlc,rrc,ral,rar
jp — jmp
jp… — j… (например jz,jnz,jc)
call — call
call… — c…
ret — ret
ret… — r…
rst — rst
push,pop — push,pop
ex hl, (sp) — xthl
ld sp,hl — sphl
in,out,hlt,di,ed — так же

Так же надо учесть что регистровые пары именуются старшим битом, то есть вместо BC надо писать B.
Разобрались с процессором, давайте что-то напишем.
Распакуйте архив asm.rar, создайте фаил file.asm, напишите там:

.org 0
    mvi c,100
    call $f809
    hlt
.end
{пустая строка}

Сохраните и запустите compile.bat
Должны в консоли выводиться буковки, ошибки если есть и должен запуститсься собранный фаил, если вы правильно ассоциировали.
Программа должна вывести на экран букву Д, если вы её видите, то всё хорошо, если нет, возможно Луна не в той фазе.
Рассмотрим некоторые процедуры монитора. Они выполняют операции ввода/вывода.
$f803 — ожидает нажатия клавиши. Результат — в А.
$f809 — вывод символа из С на экран.
$f818 — вывод сообщения из hl на экран (конец — 0)
$f81b — опрос клавиатуры без ожидания. результат в А ($FF — ни одна клавиша не нажата.)
На сегодня пока всё. Следует предупредить о некоторых моментах:
Создавая программы этой сборкой вы будете получать фуцки от DDp, так как моя утилита bin2rku генерирует неправильную контрольную сумму.
Ассемблер TASM старый, написан для дос, поэтому не запустится на 64-битных системах. Проблема.
Домашнее задание: Напишите что-нибудь.
Всем пока и до новых встреч!

3 комментария

avatar
В порядке обмена опытом. Когда я писал для РК-совместимых, использовал SjAsm, учитывая отличия 8080 'в уме'. Так было проще, чем другие мнемоники и мучиться с древними ассемблерами. И так как РК-совместимые мало различаются, у меня из одного исходника собирались версии для РК86, Микроши, Апогея и Партнёра, через условную компиляцию.
  • Shiru
  • +6
avatar
Да, можно пользоваться мнемониками Z80, забыл упомянуть об этом в статье.
avatar
Также далее я буду приводить примеры кодов из проектов, процедуры, а они все на этих мнемониках написаны.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.