scaraby
04.03.2016, 13:37
А кто каким ассемблером пользуется для написания программ для этого компьютера? В детстве я использовал ASSM, который поставлялся на кассете с системными программами. При его запуске упоминался в качестве автора некий товарищ Карабутов. Неудобство состояло в том, что код исполнялся сразу и без вопросов, поэтому любой неверный шаг приводил к зависанию и утомительной загрузке с кассеты среды программирования. Тем не менее, с помощью этой программы можно было заглянуть внутрь игр, что-то даже своё наваять. Однако ассемблер там однопроходной, метки при любом телодвижении нужно править вручную - это ад и израиль!
В настоящее время пользуюсь следующей технологией для создания готовых wav-файлов, пригодных для загрузки на реале:
1. Исходник пишу в "Прекрасный ассемблер КР580ВМ80А" онлайн по адресу http://asdasd.rpg.fi/~svo/i8080/ Туда же можно закидывать текстовые исходники, написанные в чём угодно, хоть в блокноте. В сравнении с ASSM - счастье просто! Результаты творческих изысканий отражаются справа в окне "на лету". Результатом работы является бинарник, который можно смело внедрять в память ПК8000 и запускать на выполнение.
2. В эмуляторе emu загружаю пакет ASSM командой bload"ASSM",r и для удобства сохраняю это состояние, чтобы одним кликом сразу попадать в ASSM. На реале эта процедура занимает несколько минут: поиск на кассете, загрузка, ошибки загрузки, если плохой магнитофон и т.д.
3. Находясь в ASSM внутри emu выбираю пункт меню View/Start Debugger. Далее в открывшемся окне Ctrl+L (загрузить бинарник), указываю адрес в который грузить содержимое бинарника. Этот адрес является тем же адресом, который указывается директивой .org в "Прекрасном". После выполнения загрузки директивой ASSM-a G - запускаю на выполнение загруженный фрагмент кода.
4. Чтобы загрузить этот код в реальный ПК8000, использую директиву ASSM-а W ИмяФайла АдресНачала АдресКонца АдресЗапуска. Например W TEST01 4000 4100 4002. Не забываю при этом перед нажатием Enter включить кнопку "Record/Stop" на панели эмулятора emu и выбираю соответствующий wav файл, готовый для загрузки.
5. Если не нужен wav, а cas, то не использую команду "Record/Stop", директива W обрабатывается эмулятором и создаёт корректный cas.
Технология получилась вполне рабочая и проверена практикой, однако, несколько громоздкой. Может, у кого-то есть опыт или идеи, как проще пройти путь от текстового исходника до реального wav?
- - - Добавлено - - -
Ну и вдогонку, в качестве примера небольшой исходник, который в графическом режиме зажигает точку на экране в выбранной позиции, ждёт нажатия упр-стоп и выходит в ASSM. На реале в Бейсик.
;ПК8000
;Прекрасный ассемблер КР580ВМ80А
;http://asdasd.rpg.fi/~svo/i8080/
;Программа определяет адрес байта в массиве графики для графического курсора
;Массив графики располагается в адресах ОЗУ 0000h-17ffh
;Нумерация идёт по принципу знакомест 32х24. Знакоместо (0,0) имеет адреса
;0000h-0007h, (0,1) 0008h-000fh, (1,0) 0100h-0107h и т.д.
;в hl - искомый адрес видео озу, с - номер бита точки на которую указывает
;графический курсор. a - маска для операции с точкой (гашение/свечение)
.binfile GraphCursor.bin
.org 4000h ;начальный адрес программы в ОЗУ
;Чтение байта из видеоОЗУ. 004ah hl - адрес, a - байт
VRAMRead equ 004ah
;Включение режима экрана. Точка входа в ПЗУ: 006Ah или 286Dh A=режим {0,1,2}
Screen equ 286dh
;Опрос нажатия Упр+Стоп.3759h Если «Упр+Стоп», то флаг C:=1
CtrlBreak equ 3759h
;Возврат в СПА
Exit equ 0ea8ah
GraphCursor db 00h,00h ;координаты графического курсора x,y (0-255,0-191)
Start:
mvi a,02h ;выбор номера режима
call Screen ;установка режима 2
;модуль определения адреса искомого байта в видеоОЗУ
lhld GraphCursor ;координаты курсора в привычной форме
mov a,l ;взяли координату х
ani 07h ;в аккумуляторе остаток от деления x/8
;это - номер (положение) точки внутри байта в массиве графики
inr a ;используется как счётчик при формировании маски
mov c,a ;запоминаем его в регистре c
mov a,l ;взяли повторно координату х
ani 0f8h ;отбросили остаток от деления x/8
;это - адрес нулевого байта соответствующего знакоместа
mov l,a ;запоминаем его в регистре l
mov a,h ;взяли координату y
ani 07h ;остаток от деления x/8 - номер строки внутри знакоместа
add l ;прибавили его к адресу нулевого байта знакоместа
mov l,a ;младший полубайт адреса готов.
mov a,h ;взяли координату y
ani 0f8h ;отбросили остаток от деления y/8
rrc
rrc
rrc ;разделили нацело y/8
mov h,a ;старший полубайт адреса готов
;формируем в аккумуляторе маску для видеоОЗУ
xra a ;инициализация маски. Записываем в аккумулятор 01h
inr a
loop01:
rrc ;устанавливаем соответствующий бит маски
dcr c ;номер бита, полученный ранее из координаты x
jnz loop01
;зажигаем точку на экране
loop02:
mov c,a ;зажигаем одну точку, не изменяя соседние маска в с
call VRAMRead ;прочитали байт из массива графики
ora c ;добавили точку к прочитанному
mov m,a ;сохранили результат
EventLoop:
call CtrlBreak ;опрос клавиатуры
jnc EventLoop
mvi a,0h ;выбор номера режима
call Screen ;установка режима 0
call Exit ;возврат в СПА
В настоящее время пользуюсь следующей технологией для создания готовых wav-файлов, пригодных для загрузки на реале:
1. Исходник пишу в "Прекрасный ассемблер КР580ВМ80А" онлайн по адресу http://asdasd.rpg.fi/~svo/i8080/ Туда же можно закидывать текстовые исходники, написанные в чём угодно, хоть в блокноте. В сравнении с ASSM - счастье просто! Результаты творческих изысканий отражаются справа в окне "на лету". Результатом работы является бинарник, который можно смело внедрять в память ПК8000 и запускать на выполнение.
2. В эмуляторе emu загружаю пакет ASSM командой bload"ASSM",r и для удобства сохраняю это состояние, чтобы одним кликом сразу попадать в ASSM. На реале эта процедура занимает несколько минут: поиск на кассете, загрузка, ошибки загрузки, если плохой магнитофон и т.д.
3. Находясь в ASSM внутри emu выбираю пункт меню View/Start Debugger. Далее в открывшемся окне Ctrl+L (загрузить бинарник), указываю адрес в который грузить содержимое бинарника. Этот адрес является тем же адресом, который указывается директивой .org в "Прекрасном". После выполнения загрузки директивой ASSM-a G - запускаю на выполнение загруженный фрагмент кода.
4. Чтобы загрузить этот код в реальный ПК8000, использую директиву ASSM-а W ИмяФайла АдресНачала АдресКонца АдресЗапуска. Например W TEST01 4000 4100 4002. Не забываю при этом перед нажатием Enter включить кнопку "Record/Stop" на панели эмулятора emu и выбираю соответствующий wav файл, готовый для загрузки.
5. Если не нужен wav, а cas, то не использую команду "Record/Stop", директива W обрабатывается эмулятором и создаёт корректный cas.
Технология получилась вполне рабочая и проверена практикой, однако, несколько громоздкой. Может, у кого-то есть опыт или идеи, как проще пройти путь от текстового исходника до реального wav?
- - - Добавлено - - -
Ну и вдогонку, в качестве примера небольшой исходник, который в графическом режиме зажигает точку на экране в выбранной позиции, ждёт нажатия упр-стоп и выходит в ASSM. На реале в Бейсик.
;ПК8000
;Прекрасный ассемблер КР580ВМ80А
;http://asdasd.rpg.fi/~svo/i8080/
;Программа определяет адрес байта в массиве графики для графического курсора
;Массив графики располагается в адресах ОЗУ 0000h-17ffh
;Нумерация идёт по принципу знакомест 32х24. Знакоместо (0,0) имеет адреса
;0000h-0007h, (0,1) 0008h-000fh, (1,0) 0100h-0107h и т.д.
;в hl - искомый адрес видео озу, с - номер бита точки на которую указывает
;графический курсор. a - маска для операции с точкой (гашение/свечение)
.binfile GraphCursor.bin
.org 4000h ;начальный адрес программы в ОЗУ
;Чтение байта из видеоОЗУ. 004ah hl - адрес, a - байт
VRAMRead equ 004ah
;Включение режима экрана. Точка входа в ПЗУ: 006Ah или 286Dh A=режим {0,1,2}
Screen equ 286dh
;Опрос нажатия Упр+Стоп.3759h Если «Упр+Стоп», то флаг C:=1
CtrlBreak equ 3759h
;Возврат в СПА
Exit equ 0ea8ah
GraphCursor db 00h,00h ;координаты графического курсора x,y (0-255,0-191)
Start:
mvi a,02h ;выбор номера режима
call Screen ;установка режима 2
;модуль определения адреса искомого байта в видеоОЗУ
lhld GraphCursor ;координаты курсора в привычной форме
mov a,l ;взяли координату х
ani 07h ;в аккумуляторе остаток от деления x/8
;это - номер (положение) точки внутри байта в массиве графики
inr a ;используется как счётчик при формировании маски
mov c,a ;запоминаем его в регистре c
mov a,l ;взяли повторно координату х
ani 0f8h ;отбросили остаток от деления x/8
;это - адрес нулевого байта соответствующего знакоместа
mov l,a ;запоминаем его в регистре l
mov a,h ;взяли координату y
ani 07h ;остаток от деления x/8 - номер строки внутри знакоместа
add l ;прибавили его к адресу нулевого байта знакоместа
mov l,a ;младший полубайт адреса готов.
mov a,h ;взяли координату y
ani 0f8h ;отбросили остаток от деления y/8
rrc
rrc
rrc ;разделили нацело y/8
mov h,a ;старший полубайт адреса готов
;формируем в аккумуляторе маску для видеоОЗУ
xra a ;инициализация маски. Записываем в аккумулятор 01h
inr a
loop01:
rrc ;устанавливаем соответствующий бит маски
dcr c ;номер бита, полученный ранее из координаты x
jnz loop01
;зажигаем точку на экране
loop02:
mov c,a ;зажигаем одну точку, не изменяя соседние маска в с
call VRAMRead ;прочитали байт из массива графики
ora c ;добавили точку к прочитанному
mov m,a ;сохранили результат
EventLoop:
call CtrlBreak ;опрос клавиатуры
jnc EventLoop
mvi a,0h ;выбор номера режима
call Screen ;установка режима 0
call Exit ;возврат в СПА