EMT - не верь глазам своим

 


Задумал я одну диверсию, и вернулся к коду на БК0010. Нашел описание печати текста через вызов EMT и тут же обломался: текст не печатает, как и должно быть. Мне стало грустно, ведь залумка не получилась. Спросил в Телеграмчике, ребята подсказали, что удобнее использовать CLR R2. Заработало, причина в том, что я неверно вызывал функцию:

;107050 — ЕМТ 20 — формирование строки символов.
;Вход R1 — адрес строки символов
;Вход R2 — длина строки (мл. байт), символ-ограничитель (ст. байт)

А дальше начались приключения - из-за высоты символов 10 пикселей текст не умещается. Написал другую процедуру печати текста, уместив текст с высотой 8 точек. Manwe предложил использовать пакер программы, но есть проблема - адрес программы должен быть другим. Указанный адрес понимает ассемблер PDPy11. Возиться с установкой Python3 мне не хотелось, стал читать доки BKTurbo8.

Компиляция изменилась:

set nam=draw
del %nam%.bin
BKTurbo8.exe -l -o cl %nam%.asm
BKTurbo8.exe -l -o li -s 1042 %nam% %nam%.obj
del %nam%.obj
del %nam%.lst
rem ren %nam%.bin %nam%.bin
pause

Пакер сработал, программа уменьшилась в размере. Но мне показалось мало, я решил разобраться с еще одним вопросом - как строить точки. Чтение описания подсказало, какие функции вызвать.

;107612 — ЕМТ 30 — формирование точки по координатам.
;Вход R0: 1 — запись точки, 0 — стирание точки
;Вход R1 — координата х
;Вход R2 — координата y


И еще один облом - точки рисуются, но похоже, что координата Х делится на 2. На галерке подсказали, что причина в режиме "32 символа в строке". Похоже, что этот режим устанавливает монитор. Стал читать дизассемблер процедуры EMT 30, запись данных в ячейки ни к чему не привела.

Опять читаю доки, помогла печать кода 233o через функцию  EMT 16. Заработало! Только с цветом не решено до конца. Еще одна попытка печати управляющих кодов ни к чему не привела. Решение уже подсказали в Телеграмчике: MOV    #125252,@#214 запись маски цвета.


Вышла короткая программа

;107612 — ЕМТ 30 — формирование точки по координатам.
;
;Вход R0: 1 — запись точки, 0 — стирание точки
;Вход R1 — координата х
;Вход R2 — координата y
;; MOV     #1001,@#162
MOV #233,R0
EMT 16
O:
ADD R3,R1
ADD R4,R3
INC R4
ADD R4,R2
MOV    R1,-(SP)
CLRB R1
SWAB R1
MOV    R2,-(SP)
CLRB R2
SWAB R2
;color
MOV R4,R0
; BIC #0b1111111111111000,R0
BIC #0b1111111111111100,R0
MOVB mask(R0),@#214
; MOV    #125252,@#214
MOV #1,R0
EMT 30
MOV (SP)+,R2
MOV (SP)+,R1
BR O
mask:
;.word 0,0xaaaa,0x5555,0xffff
.byte 0,0xaa,0x55,0xff
.EVEN
.END



Комментарии