4 дня назад мне приснился сон, о котором нет смысла рассказывать. С утра я полез в теорию и стал задавать Google различные вопросы, нашел парочку интересных симуляторов - Toy и DCPU-16.
DCPU-16 появился в игре 0x10c, а позже переехал в MineCraft. Нашлось несколько Web-симуляторов, но интернет не вечен - вчера появилась страница, а послезавтра исчезла без следа. Нашел упоминание об DCPU-16 Studio и стал искать. В Web Archive сохранилась страница проекта без исходников и скомпилированных бинарей. К счастью, на GitHub нашелся fork и я решил скомпилировать программу. Первой облом утром - требуется компонент LazHelp того же автора, который бесследно исчез. Нашел архив, и пару часов разбирался, как подключить - я не знаком с Lazarus. Подключил и еще пару часов пытался скомпилировать, но все же победил!
Стал разбирать скачанные страницы с документацией и остановился на статье, посвященной экране.
Первая программа, что я написал. Экран слишком мелкий, но его можно увеличить: пункт меню View->User screen.
Вместе с сырками программы нашлось несколько примеров, в том числе печать текста, но похоже, что писал ее нуб. Стал искать дальше, нашел, запустил и ассемблер подавился на опкоде HWI 0. Стал искать дальше и нашел другую спецификацию версии 1.7. Однако, за время пути собака могла подрасти. происки продолжились и нашелся еще один со всякими спецификациями.
Я решил попробовать накодить рисование XOR pattern и изучить опкоды. Набрал код, что работал в DCPU-16 Studio и ничего не появилось на экране.Стал разбираться- сначала нужно включить экран:
SET A, 0
SET B, 0x8000
HWI 0
SET [0x8000], 0x9E35
:lp
set PC, lp
SET A, 0
SET B, 0x8000
HWI 0
; map font
SET A 1
SET B 0x8400
HWI 0
SET [0x8400],0x0102
SET [0x8401],0x0408
SET I,0x8000
SET B,0
:ylp
SET C,0
:xlp
SET A,C
XOR A,B
SHL A,8
IFN A,0
BOR A,0xF000
;BOR A,32
SET [I],A
ADD I,1
;next c
ADD C,1
IFE C,32
SET PC,nextb
SET PC,xlp
:nextb
ADD B,1
IFE B,32
SET PC,lp
SET PC,ylp
:lp
SET PC,lp
:ch
DAT 0x8040
До меня позже дошло, что я неверно посчитал адрес для пробела. поэтому здесь используется символ с кодом 0. Формат хранения описан в вышеупомянутой статье: ffffbbbbBccccccc. ffff - цвет текста, bbb - цвет фона, ccccccc - код символа, B - признак яркости. Но и на этом я не остановился, добавив код к программе:
SET A, 0
SET B, 0x8000
HWI 0
;set pal
SET A, 2
SET B, pal
HWI 0
; map font
SET A 1
SET B 0x8400
HWI 0
;SET [0x8400],0x0102
;SET [0x8401],0x0408
SET I,0x8000
SET B,0
:ylp
SET C,0
:xlp
SET A,C
XOR A,B
SHL A,8
IFN A,0
BOR A,0xF000
;BOR A,32
SET [I],A
ADD I,1
;next c
ADD C,1
IFE C,32
SET PC,nextb
SET PC,xlp
:nextb
ADD B,1
IFE B,32
SET PC,lp
SET PC,ylp
:lp
SET PC,lp
:ch
DAT 0x8040
:pal
DAT 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
Формат цвета тоже описан в lem1802.txt
После прогулки я придумал другой алгоритм рисования, результат виден в заголовке:
:xlp
SET A,I
SET B,I
SUB B,0x8000
SHR B,4
XOR A,B
AND A,15
SHL A,8
BOR A,0x23
SET [I],A
ADD I,1
IFN I,0x8200
SET PC,xlp
:Crash SET PC, Crash
Дополнение. Исправил одну программу:
:xlp
SET A,I
SET B,I
SHR B,4
XOR A,B
AND A,15
SHL A,8
BOR A,0x23
SET [0x8000+I],A
ADD I,1
IFN I,0x0200
SET PC,xlp
:Crash SET PC, Crash
Комментарии
Отправить комментарий