Making of Plotr64b

 


Давным-давно я хотел разобраться с программирование на Sam Coupe - наверное в 90х годах, когда ESI в своих мегадемо упомянули этот компьютер. Но первые попытки изучить основы железа ни к чему не привели, так как я не нашел никакой документации. Нашел образец исходника, на основе которого я написал 256б интро oboi , на этом всё и закончилось. Пару лет назад на форуме ZXDB создали раздел, посвященный компьютеру, и я снова вернулся к вопросам программирования - мне хотелось разобраться самостоятельно, без помощи форумчан. Снова безрезультатно. И тут я решил просмотреть подборку электронных журналов Fred в надежде получить нужную информацию. Итогом стала отдельная папка, которая хранила кучу картинок формата ss4, шрифтов, музонов E-tracker и выдернутых статей и программ. А еще я нашел разную документацию - SAM Coupe Technical Manual-Full.pdf и статей на разных сайтах. Я написал пару 256b интро и вернулся к простому интро, которое использует алгоритм Minsky circle.

Память компьютера организована другим образом:

рисунок взят из упомянутого документа.
порт 250(LMPR) управляет секциями A и B. Если записать в порт значение 0, то по адресу $0000-$3FFF подключена страница 0, а по адресу $4000-$7FFF страница 1.Так же можно переключать страницы с помощью порта 251(HMPR).
Я решил использовать привычный режим 4 - 256х192 точки, 16 цветов. Для управления режимом нужно использовать порт 252(VMPR), биты 5-6 определяют режим 1-4, битв 4-0 номер страницы видеопамяти.
(схема взята из упомянутого PDF)

Один байт используется на формат двух точек - старший и младший ниблы для 16 цветов. Получается, что одна линия режима 4 займет 128 байт. Всего 128*192-24576 байт видеопамяти, которые подключены по адресам $0000-$8000.


c1:
ld a,r
ld d,a ; случайное значение для Y
; ld h,0 ; очистка экрана для следующего кадра
xor a
ld h,a
cls: ld (hl),a;0
inc hl
bit 7,h
jr z,cls ; В начале кода интро HL=$8000
ld b,$11; значение цвета для построения точки
plp:
;X=X-Y/2 ; просто Mincky circle
ld a,d
sra a
sub e
neg
ld e,a
;Y=Y+X/2
sra a
add a,d
ld d,a

push de
;plot
srl d ; вычисление адреса видеопамяти D*128+E/2(y*128+x/2)
rr e
sbc a,a
xor $0F
ld c,a ; вычисление маски для точки
ld a,(de) ; простой трюк xor-and-xor, запись нового цвета по координатам
xor b
and c
xor b
ld (de),a
pop de
ld a,b ; следующий цвет
add a,$11
ld b,a
inc hl ; цикл от$8000 до 0, этого достаточно для одной картинки
bit 7,h
jr nz, plp
djnz $ ; задержка и переход к новому кадру
jr c1

xor-and-xor потребует пояснения. В зависимости от координаты цвет меняется:
для старшего нибла: m(DE)=m(DE) and $0F or (B and $F0)
для младшего: m(DE)=m(dE) and  $F0 or (B  and $0F)

Архив взят с World of Sam, к нему добавлен комментарий, который мне показался странным:

MGT file of fixed (due to a now-fixed bug in MGTman) and autobooting image attached to this entry

Комментарии