снова МК-90

 

Три года назад занимался эмулятором, но так и не довел до конца. Запустил эмулятор, взял компиляторы на github. И тут новый облом - не удалось получить бинарь из объектного файла, который создает MACRO-11. Поэтому взял pdpxasm. Эмулятор использует два файла - smp0.bin и smp1.bin, которые при выборе загружаются в память по адресу 0. Инициализацию и очистку экрана я подсмотрел у автора.

Компиляция:

pasm smp0.mac
plink smp0.pob
ren smp0.pdp smp0.bin
del smp0.pob
pause

Файл smp0.mac

.radix 10
.loc 0
nop
mov #scr,r0
mov #500,r1
zm:
clrb (r0)+
sob r1,zm
;fill
mov #scr,@#59392;e800
wa: br wa
scr:

Теперь запускаю отладчик(клавиша F3) и начинаю редактировать память. Разрешение экрана 120х64, получается, что на линию экрана отведено 120/8=15 байт.

Но вышло не так просто, и после экспериментов нарисовалась другая картинка:
один байт - данные для первой линии, следующий байт за ним - данные для линии, которая ниже на 32.

    00 01 02 03 04
    AA BB CC DD
00 AACC
..
32 BBDD

С ассемблером стало еще хуже - проблемы с исчислением чисел, и я пересел на другой pdp11asm. Код немного изменился:
org 0
nop
; mov #0x200,@#0xe800
jsr pc,@#0xca6c
; mov #scr,r0
; mov #0x500,r1
;zm:
; clrb (r0)+
; sob r1,zm
;ww: br ww
;fill
mov #0x55,r1
mov #0x200,r0
mov #0x20,r3
fy:
mov #0x0F,r2
fx:
mov r1,(r0)+
sob r2,fx
comb r1
sob r3,fy
; mov #scr,@#0xe800
wa: br wa
scr:
Для простоты я взял адрес очистки экрана $CA6C и посмотрев в отладчике, увидел, что задается адрес $0200. Идея неплохая, если код втиснется в размер 512 байт.
Прежде чем сесть за код построения точки, я заглянул на старую страницу. О, чудо, код уже есть!

Но есть проблема: ассемблер не понимает опкоды PDP11: ash(сдвиг) и mul(умножение). Не проблема: забил в отладчике инструкции и посмотрел на байты. Переписанная программа снова не заработала - ошибся с опкодами команды mul. Переписал заново:
org 0
nop
mov #0x3C0,r1
zm:
movb #0,scr-1(r1)
; clr scr(r1)
sob r1,zm
mov #scr,@#0xe800
;plot pixel
mov #0x3f,r3
mov #0x1200,sp
pllp:
mov r3,r0 ;x
mov r3,r1 ;y
call plot
sob r3,pllp
ww: br ww
plot:
pixel: mov #0x8000,r2
bit #0x20,r1
bne pixel1;Y<32?
swab r2
pixel1: mov r0,-(sp)
bic #0xFFF8,r0
neg r0
.byte 0x80,0x74; ash r0,r2
mov (sp)+,r0
asr r0
asr r0
bic #1,r0
bic #0xFFE0,r1
; mul #0x1E,r1
.byte 0x57,0x70,0x1e,0
add r0,r1
bis r2,scr(r1)
rts pc
scr:

Похожий косяк был у окружности, я не стал разбираться, в чем причина и заново переписал код:
plot:
pixel: mov #0x8000,r2
bit #0x20,r1
bne pixel1;Y<32?
swab r2
pixel1: mov r0,-(sp)
bic #0xFFF8,r0
; neg r0
; .byte 0x80,0x74; ash r0,r2
beq skpa
shlp:
ror r2
sob r0,shlp
skpa:
;
mov (sp)+,r0
asr r0
asr r0
bic #1,r0
bic #0xFFE0,r1
; mul #0x1E,r1
.byte 0x57,0x70,0x1e,0
add r0,r1
bis r2,scr(r1)
rts pc


А если разобраться, то вышел красивый код, в котором учтены все особенности структуры экрана. Но мне этого хватило, поэтому вернусь позже.

Комментарии