Абсолютно нерешабельная проблема. Подумать только, 8 раз одно и то-же писать... Все, сворачиваем тему...
Абсолютно нерешабельная проблема. Подумать только, 8 раз одно и то-же писать... Все, сворачиваем тему...
ничего никуда не сворачиваем. разберёмся, какие там 8 раз и почему...
---------- Post added at 10:57 ---------- Previous post was at 09:24 ----------
вот кусок оригинального макроса:
начнём с того, что меткиКод:cur\\\\6=$+1 LD DE,0 LD A,E ;основное направление ;IFN mainplus ;основное направление положительно ; CPL ;1-основное направление ; LD E,A ;ENDIF LD LX,A ;IX=dist*cos MULPOS IFN secplus ;побочное направление положительно ADD A,D ;побочное направление LD B,A ;LD HL,(curYX) ray\\\\_YX=$+1 LD HL,0 IFN "\6\6"-"xx" ;LD D,H,E,L ;SET mapdifbit,E ray\\\\_YX2=$+1 LD DE,0 ELSE LD D,H,E,L ENDIF JNC raynshort\\\\6 INC \5 ;e/d LD A,(DE) RLA JC raysec\\\\6 INC \3 ;l/h raynshort\\\\6 IFN "\6\6"-"yy" SET mapdifbit,L ENDIF ELSE LD L,A LD A,D ;побочное направление SUB L LD B,A ;LD HL,(curYX) ray\\\\_YX=$+1 LD HL,0 IFN "\6\6"-"xx" ;LD D,H,E,L ;SET mapdifbit,E ray\\\\_YX2=$+1 LD DE,0 ELSE LD D,H,E,L ENDIF
cur\\\\6=$+1
ray\\\\_YX=$+1
ray\\\\_YX2=$+1
и ещё несколько других в макросе не используются (по ним нет переходов). их можно закоментить. Условия компиляции IFN меняются на ifdef. Метки по которым есть переходы в макросе можно заменить на подобные конструкции:
было - JNC raynshort\\\\6
стало - jr nc, $+n, где n размер пропускаемого кода до нужного места.
В этом случае все метки просто комментятся или удаляются.
Остались под вопросом конструкции типа:
IFN "\6\6"-"yy" - пока не понял как это понимать вообще. точнее я понимаю, что "\6" это номер аргумента макроса. мне не ясна сама конструкция "\6\6"-"xx". Аргумент 6 - это координата "y". Я могу понять эту запись только как (y+y)-(x+x). Если результат положительный, тогда условие выполняется так, иначе (отрицательный результат или 0) будет выполняться так.
и конструкции типа INC \2 - это вообще не понял как работает.
ах да, ещё одни способ обойти эти чудесные макросы - сделать их обычными процедурами. передавать параметры или через стэк или регистры. как угодно. Да, немного тактов потеряем, зато много памяти выигрываем.
Последний раз редактировалось Sayman; 01.11.2015 в 08:08.
ты кстати зря сократил так имена меток
дело в том что упоминавшиеся Алоне параметрически метки выглядят весьма хитро.
то что тебе непонятны указанные пункты означает что ты вообще не понял как работают Макросы в АлАсме
попробую обьяснить.
вот оригинальный макрос
вот процедура рейкастаКод:;RAY 1,1,H,L,D,E,y,x MACRO RAY mainplus=\0 ;основное направление положительно secplus=\1 ;побочное направление положительно ;\2=основное направление для hl ;\3=побочное направление для hl ;\4=основное направление для de ;\5=побочное направление для de ;\6=основное направление ;\7=побочное направление ;LD DE,(cur\7\6) cur\0\1\7\6=$+1 LD DE,0 LD A,E ;основное направление ;IFN mainplus ;основное направление положительно ; CPL ;1-основное направление ; LD E,A ;ENDIF LD LX,A ;IX=dist*cos MULPOS IFN secplus ;побочное направление положительно ADD A,D ;побочное направление LD B,A ;LD HL,(curYX) ray\0\1\7\6_YX=$+1 LD HL,0 IFN "\6\6"-"xx" ;LD D,H,E,L ;SET mapdifbit,E ray\0\1\7\6_YX2=$+1 LD DE,0 ELSE LD D,H,E,L ENDIF JNC raynshort\0\1\7\6 INC \5 ;e/d LD A,(DE) RLA JC raysec\0\1\7\6 INC \3 ;l/h raynshort\0\1\7\6 IFN "\6\6"-"yy" SET mapdifbit,L ENDIF ELSE LD L,A LD A,D ;побочное направление SUB L LD B,A ;LD HL,(curYX) ray\0\1\7\6_YX=$+1 LD HL,0 IFN "\6\6"-"xx" ;LD D,H,E,L ;SET mapdifbit,E ray\0\1\7\6_YX2=$+1 LD DE,0 ELSE LD D,H,E,L ENDIF JNC raynshort\0\1\7\6 LD A,(DE) RLA JC raysec\0\1\7\6 DEC \3,\5 ;l/h,e/d raynshort\0\1\7\6 IFN "\6\6"-"yy" SET mapdifbit,L ENDIF ENDIF raynsec\0\1\7\6 INC HX IFN mainplus ;основное направление положительно INC \2 ;h/l ENDIF LD A,(HL) RLA JP C,rayhlq ;b=texx IFN mainplus ;основное направление положительно INC \4 ;d/e ELSE DEC \2,\4 ;h/l,d/e ENDIF LD A,B IFN secplus ;побочное направление положительно ADD A,C ELSE SUB C ENDIF LD B,A JNC raynsec\0\1\7\6 IFN secplus ;побочное направление положительно INC \5 ;e/d ENDIF LD A,(DE) RLA JC raysec\0\1\7\6 IFN secplus ;побочное направление положительно INC \3 ;l/h ELSE ;побочное направление отрицательно DEC \3,\5 ;l/h,e/d ENDIF JP raynsec\0\1\7\6 raysec\0\1\7\6 EXD LD A,B IFN secplus ;побочное направление положительно SUB C DIVPOS ELSE ADD A,C DIVNEG ENDIF IFN mainplus ;основное направление положительно CPL LD B,A ;b=texx ELSE LD B,A ;b=texx CPL ENDIF JP raydeq ENDM
а если учесть наличие ссылок на эти места из других мест программы и отказ работы в сжасм связок вида.Код:;mainplus=\0 ;основное направление положительно ;secplus=\1 ;побочное направление положительно ;\2=основное направление для hl ;\3=побочное направление для hl ;\4=основное направление для de ;\5=побочное направление для de ;\6=основное направление ;\7=побочное направление ray1 BIT 7,L JP NZ,ray1b RAY 1,1,L,H,E,D,x,y ;1a ray1b RAY 1,1,H,L,D,E,y,x ;1b ray2 BIT 7,L JP NZ,ray2b RAY 1,0,H,L,D,E,y,x ;2a ray2b RAY 0,1,L,H,E,D,x,y ;2b ray3 BIT 7,L JP NZ,ray3b RAY 0,0,L,H,E,D,x,y ;3a ray3b RAY 0,0,H,L,D,E,y,x ;3b ray4 BIT 7,L JP NZ,ray4b RAY 0,1,H,L,D,E,y,x ;4a ray4b RAY 1,0,L,H,E,D,x,y ;4b rayhlq XOR A raydeq ;теперь раскрываем один из макросов вот этот RAY 1,1,L,H,E,D,x,y ;1a { ;RAY 1,1,H,L,D,E,y,x MACRO RAY mainplus=1 \0 ;основное направление положительно secplus=1 \1 ;побочное направление положительно ;L \2=основное направление для hl ;H \3=побочное направление для hl ;E \4=основное направление для de ;D \5=побочное направление для de ;x \6=основное направление ;y \7=побочное направление ;LD DE,(curyx) cur11yx=$+1 LD DE,0 LD A,E ;основное направление ;IFN mainplus ;основное направление положительно ; CPL ;1-основное направление ; LD E,A ;ENDIF LD LX,A ;IX=dist*cos MULPOS IFN secplus ;побочное направление положительно ADD A,D ;побочное направление LD B,A ;LD HL,(curYX) ray11yx_YX=$+1 LD HL,0 IFN "xx"-"xx" ;LD D,H,E,L ;SET mapdifbit,E ray11yx_YX2=$+1 LD DE,0 ELSE LD D,H,E,L ENDIF JNC raynshort11yx INC D ;e/d LD A,(DE) RLA JC raysec11yx INC H ;l/h raynshort11yx IFN "xx"-"yy" SET mapdifbit,L ENDIF ELSE LD L,A LD A,D ;побочное направление SUB L LD B,A ;LD HL,(curYX) ray11yx_YX=$+1 LD HL,0 IFN "xx"-"xx" ;LD D,H,E,L ;SET mapdifbit,E ray11yx_YX2=$+1 LD DE,0 ELSE LD D,H,E,L ENDIF JNC raynshort11yx LD A,(DE) RLA JC raysec11yx DEC h,d ;l/h,e/d raynshort11yx IFN "xx"-"yy" SET mapdifbit,L ENDIF ENDIF raynsec11yx INC HX IFN mainplus ;основное направление положительно INC l ;h/l ENDIF LD A,(HL) RLA JP C,rayhlq ;b=texx IFN mainplus ;основное направление положительно INC E ;d/e ELSE DEC L,E ;h/l,d/e ENDIF LD A,B IFN secplus ;побочное направление положительно ADD A,C ELSE SUB C ENDIF LD B,A JNC raynsec11yx IFN secplus ;побочное направление положительно INC D ;e/d ENDIF LD A,(DE) RLA JC raysec11yx IFN secplus ;побочное направление положительно INC H ;l/h ELSE ;побочное направление отрицательно DEC H,D ;l/h,e/d ENDIF JP raynsec11yx raysec11yx EXD LD A,B IFN secplus ;побочное направление положительно SUB C DIVPOS ELSE ADD A,C DIVNEG ENDIF IFN mainplus ;основное направление положительно CPL LD B,A ;b=texx ELSE LD B,A ;b=texx CPL ENDIF JP raydeq ENDM }
dup
if
endif
edup
то да - беда может быть
С уважением,
Jerri / Red Triangle.
перепишите алласм под виндовс, это проще будет чем с движком разбираться. почему алоне решил что математический процессор ничего не ускорит? в коде игры нет деления, умножения, вычитания и сложения? аппаратные тригонометрические функции позволят вообще другой движок самим неплохо написать, чем связываться с особо хитрым и непонятным движком, у которого ещё и с текстурами серьёзные проблеммы похоже будут вылазить.
GS может выступать в роли математического сопроцессора?
Скрытый текст
ZX Spectrum +2 +divIDE + BDI
Profi 1024k plus
Scorpion ZS-256 Turbo+
ZX Evolution rev.C2+NeoGS+SDCard HxC Floppy Emulator
ZX Evolution rev.C2+ZXM-SoundCard Extreme+ZXM-MoonSound
AVR ZX Spectrum V2.0
Орион 128[свернуть]
лучше доработать сжасм. исходники есть.перепишите алласм под виндовс
при этом, сжасм из аргументов макроса вытягивает в метку содержимое параметров...вроде...но всё ровно ошибки прут.
ну если ко всем подключается. то это неплохо. только по фоткам я просто цветные кубики увидел и всё. во вторых, зачем в этой платке ещё один z80 нарисовался? вроде же плата для графики?
Для разбора настоятельно рекомендую написать автомат, который будет собирать модифицированный тобой исходник, сравнивать побайтно с результатами сборки алоновского исходника и вразумительно показывать разницу. Это сэкономит 100500 времени на отладку.
Сжасм не умеет динамические метки и много чего еще. Он прост как валенок. Проще переписать его с нуля тогда. Но есть один нюанс: это не поможет. Менять движок и делать на его основе игру можно только после полного просветления. А, когда наступит просветление, движок можно легко переписать и на ужасм.
Нет. Во-первых, в GS тот же Z80, только побыстрее, он будет считать по тем же алгоритмам, что и ЦП, а ЦП будет его ждать. А еще в GS нельзя загрузить число каким-нибудь OTIR, поэтому циклы обмена с ним будут с лихвой компенсировать разницу в скорости расчета.
[offtop]Вообще, сопроцессор в идеале должен сам уметь брать данные из памяти ЦП и возвращать в нее результат. А лучше сразу и данные, и команды. Как чуть более медленный вариант - уметь INIR/OTIR для обмена данными. [/offtop]
В GS можно засунуть не просто примитивную математику, а целиковые алгоритмы, которые можно просчитывать параллельно с отрисовкой. При условии, что эти алгоритмы возвращают единицы байт, а не экран целиком.
Последний раз редактировалось Alex Rider; 01.11.2015 в 15:09.
ZX Evolution Rev C + ZXM-SoundCard Extreme + NeoGS.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)