-
Друзья!
Как можно автоматизировать процесс переноса скомпиленного кода в эмулятор? Вот сейчас я ассемблером собираю прожку, делаю дамп этой проги, открываю в эмуляторе дебагер, иду в дампе дебагера на адрес &h5000 и забиваю вручную байты со своего дампа. И так каждый раз! Если что-то меняется в начале программы, то дамп приходится перенабирать заново, что очень неудобно! Программки то становятся всё длиннее и длиннее!
-
Компилируй в CAS формат и затем в эмуляторе:
BLOAD "Имя", R
-
Вложений: 1
Получается! Только bload "tstprg" без R, а далее x=urs(&h5000)
Код:
ORG 0x5000-0x26
DB 0x1F, 0xA6, 0xDE, 0xBA, 0xCC, 0x13, 0x7D, 0x74
DB 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0
DB 'tstprg'
DB 0x1F, 0xA6, 0xDE, 0xBA, 0xCC, 0x13, 0x7D, 0x74
DW START, ENDE, START
START: lxi h, num1; грузим в HL адрес строки с первым числом
call 0x13c6; FIN - переводим строку в FACCUM
call 0x130d; FCOPYTOBCDE - переводим FACCUM в BCDE формат
push b; сохраним BCDE временно
push d
lxi h, num2; грузим в HL адрес строки со вторым числом
call 0x13c6; FIN - переводим его в FACCUM
pop d; восстановим BCDE
pop b
call 0x1082; FADD2 - складываем FACCUM и BCDE, результат остаётся в FACCUM
call 0x1470; FOUT - выводим FACCUM в строку (буфер строки расположен в FBUFFER)
lxi h, 0xf93d; FBUFFER
mvi a, 2; выводим строку с текущего положения
call 0x0050; TRETLINE - печатаем содержимое FBUFFER
ret
num1 db "1.234E2"
db 0x0
num2 db "3.654E1"
db 0x0
ENDE:
END
Это наш пример сложения чисел, только под CAS и без извратов со стеком и JMP!
-
Вложений: 2
А вот тут уже загвоздка. Две программы, которые должны делать одно и то же. Но ассемблерный вариант рисует две лишние точки (не там) и смещает часть графика.
Первая:
Код:
10 SCREEN2
30 LINE(0,96)-(255,96),12
40 LINE(128,0)-(128,192),12
100 FOR X=0 TO 255
110 Y=10*SIN(X/10)+96
120 PSET(X,Y),3
200 NEXT
1000 IF INKEY$="" GOTO1000
Вторая:
Код:
ORG 0x5000-0x26
DB 0x1F, 0xA6, 0xDE, 0xBA, 0xCC, 0x13, 0x7D, 0x74
DB 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0
DB 'tstprg'
DB 0x1F, 0xA6, 0xDE, 0xBA, 0xCC, 0x13, 0x7D, 0x74
DW START, ENDE, START
START: mvi a, 2
call 0x286d; SETMODE2
lxi h, 0xfd8f; адрес PSETC
mvi m, 12; в переменную PSETC записываем 12 цвет
inx h
mvi m, 0; X1=0
inx h
mvi m, 96; Y1=96
inx h
mvi m, 255; X2=255
inx h
mvi m, 96; Y2=96
call 0x1908; LINE_ASM - рисуем ось абсцисс
lxi h, 0xfd90; адрес X1
mvi m, 128; X1=128
inx h
mvi m, 0; Y1=0
inx h
mvi m, 128; X2=128
inx h
mvi m, 192; Y2=192
call 0x1908; LINE_ASM - рисуем ось ординат
lxi h, 0xfd8f; адрес PSETC
mvi m, 3; в переменную PSETC записываем 3 цвет
mvi c, 0; параметр цикла
loop: push b
mov a, c
call 0x12d5; FCHARTOFLOAT - перевод параметра цикла в плавающую точку
call 0x120c; FDIVBYTEN
call 0x1666; SIN
call 0x12b3; FMULBYTEN
call 0x130d; FCOPYTOBCDE - переводим FACCUM в BCDE формат
push b; сохраним BCDE временно
push d
lxi h, ord
call 0x13c6; FIN - переводим строку в FACCUM
pop d; восстановим BCDE
pop b
call 0x1082; FADD2 - складываем FACCUM и BCDE, результат остаётся в FACCUM
call 0x1367; FASINTEGER переводим FACCUM в целое
lxi h, 0xfd90; адрес X1
pop b
push b
mov m, c
inx h
mov m, e
call 0x182c; PSET_ASM
pop b
inr c
mov a, c
cpi 0x0
jnz loop
xra a
lock: call 0x007c; BUFBT2A - IF INKEY$=""
cpi 0x0
jz lock
ret
ord: db "96"
db 0x0
ENDE:
END
Довольно интересный артефакт вылазит. Буду разбираться. Картинки и CASы - во вложении.
-
А! Забыл добавить!
Первая программка:
load"sinus"
RUN
Вторая программка:
bload"tstprg"
x=usr(&h5000)
---------- Post added at 21:48 ---------- Previous post was at 20:43 ----------
Всё! Разобрался!
Исправленный вариант, дающий картинку 1:1 с Бейсиковской!
Код:
ORG 0x5000-0x26
DB 0x1F, 0xA6, 0xDE, 0xBA, 0xCC, 0x13, 0x7D, 0x74
DB 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0
DB 'tstprg'
DB 0x1F, 0xA6, 0xDE, 0xBA, 0xCC, 0x13, 0x7D, 0x74
DW START, ENDE, START
START: mvi a, 2
call 0x286d; SETMODE2
lxi h, 0xfd8f; адрес PSETC
mvi m, 12; в переменную PSETC записываем 12 цвет
inx h
mvi m, 0; X1=0
inx h
mvi m, 96; Y1=96
inx h
mvi m, 255; X2=255
inx h
mvi m, 96; Y2=96
call 0x1908; LINE_ASM - рисуем ось абсцисс
lxi h, 0xfd90; адрес X1
mvi m, 128; X1=128
inx h
mvi m, 0; Y1=0
inx h
mvi m, 128; X2=128
inx h
mvi m, 192; Y2=192
call 0x1908; LINE_ASM - рисуем ось ординат
lxi h, 0xfd8f; адрес PSETC
mvi m, 3; в переменную PSETC записываем 3 цвет
mvi c, 0; параметр цикла
loop: push b
xra a
mov d, c
mvi e, 0x0
mvi b, 0x90
call 0x12da; LONGINT - перевод параметра цикла в плавающую точку
call 0x120c; FDIVBYTEN
call 0x1666; SIN
call 0x12b3; FMULBYTEN
call 0x130d; FCOPYTOBCDE - переводим FACCUM в BCDE формат
push b; сохраним BCDE временно
push d
lxi h, ord
call 0x13c6; FIN - переводим строку в FACCUM
pop d; восстановим BCDE
pop b
call 0x1082; FADD2 - складываем FACCUM и BCDE, результат остаётся в FACCUM
call 0x136d; FASINTEGER_ASM переводим FACCUM в целое
lxi h, 0xfd90; адрес X1
pop b
push b
mov m, c
inx h
mov m, e
call 0x182c; PSET_ASM
pop b
inr c
mov a, c
cpi 0x0
jnz loop
xra a
lock: call 0x007c; BUFBT2A - IF INKEY$=""
cpi 0x0
jz lock
ret
ord: db "96"
db 0x0
ENDE:
END
Внёс два исправления. Первое - FCHARTOFLOAT видит аккумулятор как знаковое число, поэтому в картинке был излом - после 128 шло -127. Второе - использование FASINTEGER_ASM убрало артефакт в виде точки.
-
Дополнил прилично комментариев. Теперь в архиве будет ещё и map файл и обещаный Вордовский документ. Документ буду расширять по мере продвижения вперёд.
-
Э-э Кхм! С чего-бы начать? С самого главного, что-ли. Я снова в строю! Жизнь устроила мне серию бросков через бедро. Сейчас попытаюсь продолжить, то что начал.
-
Хорошо, что все хорошо кончается :) Ждем с нетерпением!
-
Жизнь, она такая, бывает и забрасывает ещё выше и без парашюта, и отстаётся только очень часто махать руками и зубами хвататься за облака...
demetrius2003, ждем новые примеры - очень занятное чтиво.
-
Прошу обратить внимание - http://zx-pk.ru/showthread.php?p=779507
Если кто поможет - буду всенепременно благодарен! Вручную набирать тысячи текста утомляет. Даже копипаста сотен комментов в разные места с разных мест - ужас ещё тот.