DCPU-16

 


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 и ничего не появилось на экране.Стал разбираться- сначала нужно включить экран:

; Attach screen
SET A, 0
SET B, 0x8000
HWI 0
 SET [0x8000], 0x9E35
:lp
 set PC, lp

А теперь результат

; Attach screen
SET A, 0
SET B, 0x8000
HWI 0

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

Это не ачивка, но воодушевленный результатом, я стал копать дальше, почитав документ lem1802.txt. Стал экспериментировать с определением шрифта, но ошибся в подсчете адресов и изменил код:


; Attach screen
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 - признак яркости. Но и на этом я не остановился, добавив код к программе:


; Attach screen
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

После прогулки я придумал другой алгоритм рисования, результат виден в заголовке:

SET I,0x8000
: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

Эмуляторы, доки, исходники тут. Какой эмулятор лучше? Мне понравились оба, но надо учесть разные версии спецификаций. В одном симуляторе увидел цветную игру Pacman с разными изменениями. Наверное, я вернусь к этой игрушке, когда появится свободное время.

Дополнение. Исправил одну программу:

SET I,0
: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



Комментарии