Не стоит так сразу рубить концы, патчи такого рода просто наводят порядок.
Вид для печати
Не стоит так сразу рубить концы, патчи такого рода просто наводят порядок.
psb, исходники из Аласм на 90% компилятся в сжасм
но вот 10% огорчают
как то
- вложенная условная компиляция
- конструирование имен меток в макросах
Скрытый текст
Код:;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
[свернуть]
- плотная запись данных (необязательно но просто приятно)
Скрытый текст
Код:DD 3f4041424445467f ;превращается в db #3f,#40,#41,#42,#44,#45,#46,#7f
[свернуть]
хм :) ты я вижу давно ничего не писал.
ты исходничек то посмотрел?
это кусок вулфа48
будет компилится в чем то кроме аласма - будет еще одна игра.
потому и необязательное :) просто удобное. просто DD которое длинное DW оно вообще как часто используется в данных?
То есть, ты пишешь просто очередную версию SjAsm только для того, чтобы уменьшить output компилятора? Тогда это не полезная идея. И да, если оно работает только под UNIX, зачем мне быть с этим по пути, если я не держу UNIX для развлечения дома?
зрение никуда не годится... я просто не пишу такой страшный *****код, который потом хрен распарсишь или поддержишь. исходник не смотрел, только мельком. стиль алоне-кодера известен и узнается сразу, больше так никто не пишет и не хочет писать, и не хочет это выкуривать. и это о чем-то да говорит.
кроме того, я обнаглею и рискну предположить, что подобное можно переложить на ужасм не так уж и сложно, было бы желание. не без костылей, но все же.
В моих примерах, кстати, не должно быть ничего экстраординарного. Я бы порекомендовал добыть еще всяких разных проектов для SjAsm.
Нашёл форк SjASMPlusUnreal: SjASMPlus 1.08 beta + Unreal 0.37.7 beta
с исходниками: http://sjasmplusunreal.codeplex.com/...Control/latest
Слушай, ну ты прекращай уже очевидное-невероятное двухгодичной давности ворошить. Эти линки тут же в теме и выкладывались. Никому оно не надо, ибо сразу же и заглохло.
Есть желание что-то сделать - прекрасно, но каждый шаг описывать здесь необязательно.
---------- Post added at 23:34 ---------- Previous post was at 23:32 ----------
Ну вот это вообще не проблема реализовать, просто оно что, действительно кому-то нужно? o_O Выглядит же как лютый ахтунг.Цитата:
DD 3f4041424445467f
---------- Post added at 23:38 ---------- Previous post was at 23:34 ----------
Я курил. Он в целом мне нравится, за исключением отсутствия много чего полезного, что есть у sjasm.
Мужики, а серьезно - вы сами-то реально собираетесь писать такой код, как у alone? Это же лютейший вынос мозга, ну да, я понимаю, что там нет 10 копий одного и того же, только вот зачем это всё кросс-ассемблеру?
я когда то грамматику Z80 асма, по офдоке, рисовал, хотел допилить до sjasmplus но как то руки не дошли
грамматика LL1 для coco/r, мож кому надо
3 резолва нарушения грамматик, можно было без них обойтись но страшное описание получилось бы
Ну, имхо, вопрос неочевидный всё же. Конечно, ассемблеры (традиционно) обычно не имели хороших препроцессоров, препроцессоры - всё же более поздняя традиция, по большому счёту. Конечно, один тул лучше двух, во всех отношениях. Но из-за того что нормального стандарта на препроцессоры для ассемблеров никогда не родилось, как раз и возникает разнобой, когда каждый ассемблер препроцессит как может.
Если ближе к делу, мне тоже не хватает в ужасме нормальных текстовых макросов. Но что-то я совсем не уверен, вынесет ли эта избушка на курьих ножках ещё один этаж надстроек.
Она встроена весьма своеобразно - определяем функцию в одном месте, а в другом её уже не видно =(
Но даже так помогает.
Поперло что то, парсер смог переварить сырок cpm
допилил:
резолвы многих неоднозначностей для LL1
вычисляемые выражения для констант
несколько директив org, defb, defw
Если пруха не попустит, буду допиливать что бы sjasm сырки понимал
попался тут один кроссасм для z80 http://members.shaw.ca/gp2000/zmac.html
из СОВЕРШЕННО необычного в нем
Cycle-counting with sett, setocf pseudo-ops and t, tilo, tihi and ocf operators.
Цитата:
The best description of the T-state counting macros can be found at the end of my cycle counting tutorial. Might also explain why you would want such a feature. setocf and ocf() are newer features not covered there. They're needed when counting clock cycles on the TRS-80 Model 4 when it runs in high speed (4 MHz) mode. While the Z-80 mostly runs twice as fast in that the opcode fetch portion of each instruction is slowed down by 2 wait states. Code on the Model 1 or Model 3 (or Model 4 running in Model 3 mode) can be timed like this:
code: ld a,(de)
ld b,(hl)
add a,b
time equ t($)-t(code)
The first two instructions take 7 T-states, the 3rd 4 T-states so zmac will set time equal to 18. But if you need cycle-accurate counts on a Model 4 you'll have to do this:
code: ld a,(de)
ld b,(hl)
add a,b
time equ t($)-t(code)+2*(ocf($)-ocf(code))
As before we get a base time of 18 T-states but in this case each instruction also takes an opcode fetch thus the equation will add an additional 6 T-states and zmac will set time to 24.
При создании sna-файла sjasm прописывает в нём по адресу #4000 JP START
Как отучить его портить экран?
Destr, не видел
у меня ругается если чтото лежит в #ff00 - #ffff
вот тут норм версия http://sourceforge.net/projects/sjasmplus/
Прошу помощи, может кто смог починить проблему "Label not found" в sjasmplus:
Цитата:
AER # sh compile.sh
SjASMPlus Z80 Cross-Assembler v1.07 RC8 (build 06-11-2008)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
Code.a80(176): error: Label not found: AER.MainCode.Logo.rnd
Pass 3 complete
Errors: 1, warnings: 0, compiled: 859 lines, work time: 0.003 seconds
Собраться помогает правка исходника AER (но считаю это не дело править работающие ранее исходники):Код:# grep rnd AER.sym.orig (эталон правильно сгенерированного файла имён)
Logo.rnd: equ 0x00005D9D
rnd: equ 0x00000000
MainCode.Logo.rnd: equ 0x00000000
# grep rnd AER.sym (то, что получается у меня без правок исходников контрольного примера - проект AER)
AER.boot.Logo.rnd: equ 0x00005D9D
rnd: equ 0x00000000
AER.MainCode.Logo.rnd: equ 0x00000000
Logo.rnd: equ 0x00000000
PS. А фичу с "." в имени hb-файлов удалось вылечить, возможно кому-то будет полезным:Код:# cat Code_a80.patch
--- Code.a80
+++ Code.a80
@@ -89,7 +89,7 @@
push bc
ld b,26
clear_one_line_loop:
- call Logo.rnd
+ call @AER.boot.Logo.rnd
ld c,a
ld a,(hl)
clear_and_operation:
Код:--- sjasm/io_trd.cpp.orig
+++ sjasm/io_trd.cpp
@@ -83,6 +83,7 @@
int TRD_AddFile(char* fname, char* fhobname, int start, int length, int autostart) { //autostart added by boo_boo 19_0ct_2008
FILE* ff;
unsigned char hdr[16], trd[31], abin[4];
+ char* last;
int i,secs,pos = 0;
aint res;
int autostart_add = autostart > 0? 4 : 0; //added by boo_boo 19_0ct_2008
@@ -165,6 +166,11 @@
}
}
+ last = fhobname + strlen(fhobname) - 1;
+ while (last > fhobname && *last != '.') {
+ --last;
+ }
+
//header of file
for (i = 0; i != 9; hdr[i++] = 0x20) {
;
@@ -175,7 +181,7 @@
if (*(fhobname + i) == 0) {
break;
}
- if (*(fhobname + i) != '.') {
+ if (*(fhobname + i) != '.' || fhobname + i < last) {
hdr[i] = *(fhobname + i); continue;
} else if (*(fhobname + i + 1)) {
hdr[8] = *(fhobname + i + 1);
Что-то у меня глюк какой-то лезет при использовании директив DISP/ENT, часть адресов к концу кода уползает куда-то на 13 байт.
upd. кажется понял.
внутри DISP/ENT нельзя делать конструкцию вида:
DUP #NN
<code>
EDUP
ORG $-1
<code>
drbars, ???
а зачем тебе DISP/ENT?
Автор SjASM отозвался.
Возможно не только мне будут полезны исходники SjASM 0.39f
http://home.online.nl/smastijn/sjasm39f.zip
наткнулся на днях, скопипастил кусочек кода, а в нем оказался не минус, а тире. в итоге IY-50 он молча скомпилил как IY+50...
действительно зачем?
Скрытый текст
только если над собой размахивать.
видишь? сам пишешь черти че и сам удивляешься :)