PDA

Просмотр полной версии : Ассемблер для 8080



shoorick
05.02.2016, 03:24
Tomasz Grysztar - автор ассемблера fasm, написал новый (http://board.flatassembler.net/forum.php?f=26): fasmg. Он не привязан к конкретной архитектуре и может быть настроен под любой процессор при помощи макросов.

В комплекте идет поддержка 8051, AVR (сыроватая) и Java-машины.
Я написал для него макросы для 8080/8085 (http://board.flatassembler.net/topic.php?t=18448) и 8048 (http://board.flatassembler.net/topic.php?t=18398)
Есть еще и для 6502 (http://board.flatassembler.net/topic.php?t=18136).

Есть версии для винды и для линукса.
Взять fasmg можно здесь (http://flatassembler.net/download.php) (в самом низу).
Приятного ассемблирования! ;)

san010101
06.02.2016, 16:33
немогли бы вы полный пакет предоставить, архивом со всеми настройками?
Я попробовал новый include установить но не что то не получилось.

- - - Добавлено - - -

Пробую применить ваши макросы для ЮТ-88 в минимальной конфигурации. В старой версии 8080 asm запускался, теперь нет. К тому же готовый файл приходилось запускать не через WinASM Studio и эмулятор, а отдельно.
В виде командного файла например (emu ut88test.rku)

zebest
06.02.2016, 17:03
немогли бы вы полный пакет предоставить, архивом со всеми настройками?
Плюсую. Для чайников, желательно с парочкой примеров типа "Hello, World!?"

shoorick
07.02.2016, 00:01
Да, постараюсь побыстрее, но как получится. Прикладываюсь к этому делу урывками...
В общем случае:
fasmg myfile.asm myfile.bin
В исходнике на первом месте должен быть включен файл 8085.inc
Если включить в исходник файл rks.inc и поставить в начале кода макрос RKS_START, а в конце RKS_END, то к бинарнику добавится заголовок с начальным и конечным адресом (как на магнитной ленте), а в конце - 2 байта, имитирующие контрольную сумму (эмулятор ее не проверяет, но ожидает ;) )
проще всего положить все в одну папку: fasmg, 8085.inc, rks.inc и исходник - и собрать в командной строке.
а проект для WinAsm Studio придется настроить, это я сделаю

- - - Добавлено - - -

вот вам привет для начала.
для линукса файлам fasmg и build сначала установить признак "исполняемый"

- - - Добавлено - - -

так, стоп!
хорошо, что я скачал зип с форума фасма...
я туда почему-то старый архив залил (или он не заменился) - там старая версия. в принципе там все работает, кроме условных возвратов и есть проблема с использованиям $... в понедельник исправлю.

- - - Добавлено - - -

спасибо хорошему человеку, который выложил rku не в раре :D

напоминаю, что при записи на ленту специалист, в отличие от рк86 и остальных подобных, писал в заголовках сначала младший байт адреса, а потом старший. поэтому пользователям ЮТ, РК86 и т.д. рекомендую использовать вместо rks.inc rk.inc с таким содержимым (формат fasmg):

;================================================= ======================
; Macros to create tape header and tail
; for emulator of some soviet computers
;-----------------------------------------------------------------------
macro RK_START? rk_org:0
db rk_org shr 8
db rk_org and 255
db rk_end_ shr 8
db rk_end_ and 255
org rk_org
end macro
;-----------------------------------------------------------------------
macro RK_END?
rk_end_ = $ - 1
dw 0
end macro
;================================================= ======================
macro ENDM? top:65535
if $>top
err "out of memory limit"
end if
end macro
;================================================= ======================

либо (формат fasm - не проверял)

macro rk_start _off {
local _org
if _off eq
rk_org = 0
else
rk_org = _off
end if
db rk_org shr 8
db rk_org and 255
db rk_end_ shr 8
db rk_end_ and 255
org rk_org
}

macro rk_end {
rk_end_ = $ - 1
dw 0
},
а в тексте программы использовать не RKS_START и RKS_END, а RK_START и RK_END

shoorick
08.02.2016, 10:02
Примеры там (http://board.flatassembler.net/topic.php?t=18448) исправил.
В том числе добавил для РК86 (проверил работоспособность на эмуляторе)
Для ЮТ-88: если он не совместим по вызовам с РК-ашкой, дайте пример хеловорда,
я посмотрю.

san010101
08.02.2016, 12:38
Заголовок для ЮТ-88 вроде как работает. Эмулятор как и прежде запускаю через командный файл иначе ни как.
Например:
создаем run.cmd
в файле пишем
emu ut88_00.rku
Если загружать из эмулятора то не работает. Предполагаю, что это глюк самого эмулятора. В остальном все вроде в порядке.

shoorick
08.02.2016, 13:55
san010101, если из пакетника запускается, то я не думаю, что это глюк эмулятора, скорее, что-то на стыке.
мне понадобятся ваш проект и файл WAAddIns.Ini (рекомендую его просмотреть в случае опасности засветить чё-нить приватное)
Я не могу сейчас запустить Emu - он у меня под вайном не работает, доставлять длл от мс не хочу, поэтому использую Emu80.
Но Emu80 не загружает rku правильно: почему-то портится первый (точнее, нулевой) байт: заменяется на F0, а так как это RP, то шансов нет.
Хотя если делать со смещением, то работает, просто и запускать тогда нужно со смещением, что не очень фэншуйно...

include "8085.inc"
include "rk.inc"

RK_START 10h
nop
lxi h,hello
call 0F818h
jmp $
hello:
db "HI THERE!",0
RK_END

b2m
08.02.2016, 15:52
Если загружать из эмулятора то не работает. Предполагаю, что это глюк самого эмулятора. В остальном все вроде в порядке.
Можно поподробнее? Я не замечал, чтобы что-то неправильно открывалось. Если можно, с примерами файлов.

san010101
08.02.2016, 16:12
Я использую минимальную конфигурацию ЮТ88. Во вложении файлы конф-ии, проект и экраны, черный это запуск файла из эмулятора, с цифрами запуск из командного файла.

ivagor
08.02.2016, 16:19
не замечал, чтобы что-то неправильно открывалось
В современных версиях rko и ori пытаются грузится в отсутствующую (сейчас) в конфиге mem2

b2m
08.02.2016, 16:58
Я использую минимальную конфигурацию ЮТ88. Во вложении файлы конф-ии, проект и экраны, черный это запуск файла из эмулятора, с цифрами запуск из командного файла.
Понятно. EMU.ext тоже изменил, значит. Я думал, речь идёт про полную версию.

В минимальной конфигурации там всё немножко криво. В файле .rku началом загрузки указан адрес 0000, он и грузится по адресу 0000, но для процессора эта память располагается с адреса C000. Нужно наверное в конфиге поменять, чтобы с адреса C000 был действительно кусок памяти с адреса C000. Тогда и файлы, скомпилированные для этого адреса будут грузиться куда надо. И компилировать надо именно с командой ORG 0С000h, иначе переходы будут не туда, куда надо.

- - - Добавлено - - -

Я думаю, надо сделать так:

....
mem1 : Memory {
size=10000
}

....

mm : MemMap {
map[0][0000-03FF].ro=bios[0000]
map[0][9000-90FF].wo=vmm
map[0][C000-C7FF]=mem1[C000]
}


Неважно, что вся память не будет использоваться, главное эмулятор будет грузить файл туда, куда указано в .rku (т.е. в самом начале должны быть байты C0 00, а не 00 00, как сейчас).

- - - Добавлено - - -


В современных версиях rko и ori пытаются грузится в отсутствующую (сейчас) в конфиге mem2
Совсем забыл про это. Конфигурацию оптимизировал, а загрузку проверить забыл. Жаль, что нужно эмуль править, если в EMU.ext просто убрать строчки с mem2, то файлы будут грузиться в нулевую страницу. Задать loadaddr=10000 тоже нельзя (обрезается до word), да и для .rko нужно было бы ещё 4 байта после E6 как-то пропустить, тоже не предусмотрено пока.

shoorick
08.02.2016, 18:11
Во вложении файлы конф-ии, проект и экраны
а WAAddIns.Ini? из папки winasm\addins?
++++++++++
Да, в принципе, не нужно, так как режим запуска эмулятора в данном проекте не используется.

1.Попытка запуска выполняется так: C:\ASM2\ut88\Emu\EMU.exe %asm_name%.rku
В проекте есть файлы ut88_00.rku и ut88_01.asm,
т.е. делается попытка выполнить команду: C:\ASM2\ut88\Emu\EMU.exe ut88_01.rku,
а такого rku нет. Т.е., это нужно исправить на:
C:\ASM2\ut88\Emu\EMU.exe %out_name%
Там же есть птичка "запускать через консоль" - она несущественна, но ее лучше убрать, т.к.
это не консольное приложение вынь32. Не знаю, как вынь>ХР вообще к ней отнесется.

2.Тип проекта установлен "прочий неисполняемый", поэтому кнопка запуска вообще блокируется.
Нужно установить "прочий исполняемый".

3.Возможно, что при запуске самого эмулятора от себя и из батника влияют разные конфиги,
поэтому он может себя по разному вести, но здесь у меня уже только догадки.

san010101
08.02.2016, 19:01
Проверил, все тот же черный экран когда грузишь из под эмулятора.
Изменения, теперь при загрузке с командной строки программа запускается автоматически (не нужно выбирать директиву 6 (запуск программы с адр. С000)) и в дальнейшем все директивы работают и программа тоже.
При запуске из эмулятора экран черный.

b2m
08.02.2016, 21:14
3.Возможно, что при запуске самого эмулятора от себя и из батника влияют разные конфиги,
поэтому он может себя по разному вести, но здесь у меня уже только догадки.
Запуск из командной строки - это то-же самое, что и открытие через File/Open. Эмулятор попытается найти в EMU.ext подходящее расширение файла и запустить соответствующий ему конфиг. При этом, в зависимости от режима mode, будут выполнены разные действия, но в целом это просто загрузка файла в память и запуск его уже в эмулируемом компьютере.

Есть другой способ загрузки. Это когда эмулируется чтение с магнитной ленты. Чтобы использовать его, нужно в мониторе (или другой программе) дать команду чтения с магнитофона. Как правило, если есть перехват процедур чтения/записи, автоматически появится окно открытия файла, и тогда байты из выбранного файла подставятся как результат выполнения процедуры чтения.

Это обычно гораздо быстрее, чем полная эмуляция чтения с магнитофона, т.е. когда эмулируется состояние порта магнитофона (это уже третий способ, когда сначала выбирается файл кнопкой на тулбаре, той что с иконкой, похожей на кнопку воспроизведения на магнитофоне, а затем вводится команда чтения с магнитофона). К этому же варианту эмулятор переходит, если отменить диалог открытия файла из предыдущего способа.

- - - Добавлено - - -


При запуске из эмулятора экран черный.
Всё, нашёл. Подтверждаю - глюк эмулятора, не находит битмапы после смены текущего каталога. Ошибка в старом плагине Indicator.dll
Убедиться можно, если поместить .rku в каталог рядом с EMU.exe, оттуда всегда работает.

san010101
09.02.2016, 05:04
Разместил файлы в корне, заработало.

shoorick
09.02.2016, 07:14
а если разместить там файлы проекта (с указанными исправлениями в свойствах проекта) - будет ли работать из студии?

san010101
09.02.2016, 08:04
Работает если в проекте есть папка UT88 от эмулятора.
В настройках студии включил прочий исполняемый файл.
Во вкладке запуск ни чего не прописывал,
если указывать C:\ASM2\ut88\Emu\EMU.exe %out_name%
то изменений нет.
Похоже что каталог UT88 от эмулятора нужно включать в проект иначе не запускается картинка.

b2m
09.02.2016, 12:33
Разместил файлы в корне, заработало.
Нет, сами битмапы не надо перемещать. Просто файл ut88_00.rku можно размещать в корне, тогда после диалога открытия файла текущий каталог останется каким и был, и всё будет найдено. Но можно поступить иначе: указать в файле конфига полный путь к файлам битмапов, тогда должно работать в любом случае. Сейчас путь относительный (не известно же, куда эмуль распакуют). Я везде добавляю путь, по которому расположен EMU.exe, а плагин Indicator.dll давно уже не менялся и там осталось без этой фичи.

san010101
09.02.2016, 14:29
Хорошо. Попробую. Попутно вопрос. В версии конфига с дисплей модулем есть поддержка СР/М и квазидиска?

Отправлено с моего A0001 через Tapatalk

b2m
09.02.2016, 15:33
В версии конфига с дисплей модулем есть поддержка СР/М и квазидиска?
Там сейчас по-минимуму: проц, память, ПЗУ, одна ВВ55, раскладка памяти тривиальная (64Кб, E800 экран, F800 биос). Есть версии СР/М, адаптированные для ЮТ-88 с 32Кб и с 64Кб. Там квазидиск располагается в основной памяти после кода СР/М. Так что никакой поддержки не требуется. Правда, я не понимаю, как можно работать в голом СР/М. Это, видимо, было сделано только для ознакомления с этой системой.

- - - Добавлено - - -

Посмотрел, для освежения в памяти, файлы cpm35.rku и cpm64.rku. Первый ничего не пишет, видимо, это как раз и есть вариант с квазидиском в основном ОЗУ, а второй пишет что-то про 256Кб. Я не помню, разбирался я с ним, или нет, и если разбирался, то почему не сделал квазидиск на 256Кб.

- - - Добавлено - - -

Первый тоже пишет, запускать надо только с 4A00h. Как и следовало из названия, 35К CP/M VERS 2.2

- - - Добавлено - - -

И надо перед запуском заполнять область 5000-53FF байтом E5, т.е. форматировать диск :)

- - - Добавлено - - -

Посмотрел второй, вспомнил. Там включается через порт 40h один из банков памяти, доступ к которым идёт через стековые команды PUSH/POP (аналогичный квазидиск в Векторе-06ц). Для Вектора я делал карту памяти в плагине, чтобы учитывать стековые команды. Для ЮТ-88 - поленился.

san010101
09.02.2016, 16:23
Интерес проявляю так как собираюсь собрать полностью весь ЮТ 88
Пока только системный модуль, в ближайшее время буду делать дисплей.

По ассемблеру, заработало, но пути не прописывал, оставил каталог с текстурами.

Есть ли какие нибудь уроки или учебные задания, попрактиковаться, именно для минимальной кон-ции. Использовать только индикаторы.

shoorick
09.02.2016, 17:13
Перепилил win2koi7 и допилил rk(s).
Теперь и с этим ассемблером можно писать строки прямо в исходнике, и они автоматически переведуться в кои-7.
Между rk(s)_start и rk(s)_end теперь можно вставлять любое количество org.
rk(s)_end теперь на всякий случай еще и контрольную сумму считает, правда, если будут промежуточные org,
то сумма будет некорректной, но в дальнейшем улучшении не вижу целесообразности.
fasmg могуч, но не тривиален.

b2m
09.02.2016, 19:19
Оказывается, я уже давно сделал фичу для отслеживания стековых команд при доступе к RAM-диску (чтобы не плодить плагинов). Добавить квазидиск в полную версию ЮТ-88 оказалось очень просто. На сайте я уже обновил файлы конфигураций. Для тех, кто не хочет качать полтора мегабайта, вот конфиг с квазидиском:

main.CPUClock=1777778Hz
main.Caption="ЮТ-88 с дисплеем"

CPU : K580wm80a {
debug=cas
mem=mm
pc=F800
port~[04-07]=sys.data
port[40]=ramdisk.~pagemask
port[A1]=regs.data[0]
}

mem1 : Memory {
size=F800
}

mem2 : Memory {
size=40000
}

font : Memory {
rom="UT88\ut88.fnt"
}

bios : Memory {
rom="UT88\bios.rom"
}

sys : K580ww55 {
portA=kbd.~mask
portB[0-6]=kbd.~data
portC[0-2]=kbd.~data2
}

ramdisk : MemMap {
map[0][0000-FFFF]=mem1[0000]
map[1][0000-FFFF]=mem2[00000]
map[2][0000-FFFF]=mem2[10000]
map[3][0000-FFFF]=mem2[20000]
map[4][0000-FFFF]=mem2[30000]
}

mm : MemMap {
cpustate=CPU.state
map[0][0000-F7FF]=mem1[0000]
map[0][F800-FFFF].ro=bios[0000]
map[1][0000-FFFF]=ramdisk
}

kbd : Keyboard {
layout="UT88\layout.kbd"
}

vid : Text-Video {
font=font[0000]
mem=mem1[E800]
mode=UT88
}

regs : K580ww55 {
portA[0]=cas.record
portA[0]=cas.playback
}

cas : tape-recorder {
iproc[FAAD-FAC5]=rk
oproc[FB24-FB50]=rk
}


Изменения отмечены красным.

- - - Добавлено - - -

Только cpm64.rku это действительно 64Кб-версия, хотя и пишет про 256Кб, но её очень просто изменить в оригинальную 256Кб-версию, достаточно поменять размер диска в DPB, т.е. изменить в .rku байт 39h по смещению 1954h на 0F9h.

san010101
13.02.2016, 05:23
shoorick, Здраствуйте.
В соседней теме о ЮТ88 обновили хелп. Данные о формате записи на ленту, это относится к минимальной конфигурации.

0х00 - 256 байт (пилот-тон),
0хЕ6 - 1 байт (байт синхронизации),
Hi(ADDR_START) - 1 байт (старший байт начального адреса),
Lo(ADDR_START) - 1 байт (младший байт начального адреса),
Hi(ADDR_END) - 1 байт (старший байт конечного адреса),
Lo(ADDR_END) - 1 байт (младший байт конечного адреса),
далее идут данные объёмом (ADDR_END - ADDR_START) байт.
Ни пилот-тона, ни синхронизации, ни контрольной суммы в конце нет.

Метод кодирования - двухфазный, период следования бита равен 0,666мс, скорость считывания порядка 1500 бит/сек.

Нужно ли корректировать файл заголовок, хотя у меня и так все работает.

shoorick
13.02.2016, 14:01
пилот и синхробайт для эмулятора не нужны.
они нужны для загрузки реального пк с реального магнитофона (или звуковой карты).
их назначение - подавить собственные шумы магнитной ленты и дать возможность компьютеру правильно определить начало блока данных и необходимость инверсии при чтении (физические тонкости бытовых магнитофонов). по этой же причине пилот и синхробайт в конце записи не требуются.
контрольная сумма в конце нужна для Радио-86РК. если ЮТ-88 ее не использует, то она, как минимум, не мешает.
для реального Специалиста я писал утилиту rks2wav (она есть в том пакете), можно ее попробовать и для ЮТ, только указать ключ, чтобы не генерировался дополнительный заголовок (в котором монитор спеца пишет имя файла). Но следует учесть, что у специалиста скорость записи выше чем у рк86, так что придется подбирать константу для чтения.

b2m
13.02.2016, 14:03
У спеца другой порядок байт в заголовке (адрес начала, адрес конца).

shoorick
13.02.2016, 14:30
rks2wav не меняет байты в заголовке, она просто добавляет в начале пилот и синхробайт и генерит wav. (как мне помниццо - 6 лет прошло :) )